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 valormin
emax
: definem os valores mínimo e máximo para dados numéricosminlength
emaxlength
: definem o comprimento mínimo e máximo para stringsenum
: a string deve representar um dos valores em um array especificadomatch
: 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 });