Atualizado: 21/06/2025

Este conteúdo é original e não foi gerado por inteligência artificial.

Definindo um Esquema no Mongoose com 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