Atualizado: 02/01/2025

Definindo um Esquema no Mongoose - Node.js

Tipos

Um esquema no Mongoose define os metadados do modelo: suas propriedades, tipos de dados e várias outras informações.

No tema anterior, o esquema foi definido da seguinte forma:

const userScheme = new Schema({
    name: String,
    age: Number
});

Valores podem ser dos seguintes tipos:

  • String

  • Number

  • Date

  • Buffer

  • Boolean

  • Mixed

  • ObjectId

  • Array

  • Decimal128

  • Map

Se a propriedade representar um objeto, definimos o tipo desse objeto:

const userScheme = new Schema({
    name: String,
    age: Number,
    company: {
        name: String,
        employee: [String], // tipo: array de strings
        date: Date
    }
});

Para mais detalhes sobre a definição de tipos, consulte o link https://mongoosejs.com/docs/schematypes.html.

Porém, isso não é tudo que um esquema pode fazer. Existem várias outras opções que podem ser definidas. Com o parâmetro default, podemos especificar um valor padrão para a propriedade. Por exemplo:

const userScheme = new Schema({
    name: {
        type: String,
        default: "NoName"
    },
    age: {
        type: Number,
        default: 22
    }
});
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
    
// Definindo o esquema
const userScheme = new Schema({
    name: {
        type: String,
        default: "NoName"
    },
    age: {
        type: Number,
        default: 22
    }
});
const User = mongoose.model("User", userScheme);
const user1 = new User(); // name - NoName, age - 22
const user2 = new User({name: "Tom"}); // name - Tom, age - 22
const user3 = new User({age: 34}); // name - NoName, age - 34
console.log(user1);
console.log(user2);
console.log(user3);

Se uma propriedade não estiver definida para o usuário, será usado o valor padrão.

Validação

O Mongoose possui várias regras de validação embutidas que podemos especificar no esquema:

  • required: exige que a propriedade tenha um valor

  • min e max: definem os valores mínimo e máximo para dados numéricos

  • minlength e maxlength: definem o comprimento mínimo e máximo para strings

  • enum: a string deve representar um dos valores em um array especificado

  • match: a string deve corresponder a uma expressão regular

Se tentarmos adicionar dados incorretos ao banco de dados, a solicitação retornará um erro:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
    
// Definindo o esquema
const userScheme = new Schema({
    name: {
        type: String,
        required: true,
        minlength: 3,
        maxlength: 20
    },
    age: {
        type: Number,
        required: true,
        min: 1,
        max: 100
    }
});
const User = mongoose.model("User", userScheme);
const user = new User({name: "Li"});
    
async function main() {
    await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
    await user.save();
    console.log("Objeto salvo", user);
}
main().catch(console.log).finally(async () => await mongoose.disconnect());

Ao executar, veremos informações detalhadas sobre o erro no console:

C:\node\mongoapp>node app.js
Error: User validation failed: age: Path `age` is required., name: Path `name` (`Li`) is shorter than the minimum allowed length (3).

Versão do Documento

Por padrão, ao salvar dados, o Mongoose adiciona um campo especial __v, que indica a versão do documento. Por exemplo, salvando um objeto válido no banco de dados:

const tom = new User({name: "Tom", age: 34});
await tom.save();
console.log(tom);

Após salvar, a aplicação exibirá o objeto no console da seguinte forma:

{
name: 'Tom',
age: 34,
_id: new ObjectId("6377c7a46fa33e19ac7a7c41"),
__v: 0
}

No console, podemos ver o campo __v. Contudo, nem sempre esse campo é necessário, e ele pode ser desativado adicionando o objeto { versionKey: false } ao esquema:

const userScheme = new Schema(
    {name: String, age: Number}, 
    { versionKey: false }
);
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com