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
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:
: exige que a propriedade tenha um valorrequired
emin
: definem os valores mínimo e máximo para dados numéricosmax
eminlength
: definem o comprimento mínimo e máximo para stringsmaxlength
: a string deve representar um dos valores em um array especificadoenum
: a string deve corresponder a uma expressão regularmatch
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
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
{ versionKey: false }
const userScheme = new Schema(
{name: String, age: Number},
{ versionKey: false }
);