Nesta página, vamos aprender a definir nosso esquema em Mongoose.
Introdução
Em Mongoose, tudo começa com um Esquema (Schema). Cada esquema mapeia para uma coleção no MongoDB. Adicionalmente, esse esquema defini o formato da coleção e documentos. Quando se trabalha com Mongoose, grande parte dos detalhes do MongoDB são abstraídos, isso fica ainda mais forte se usarmos NestJS, que vamos falar sobre no curso; contudo, um passo de cada vez😎 .
Sugestão de leitura, focado no MongoDB: Shannon Bradshaw, Eoin Brazil, Kristina Chodorow. MongoDB: The Definitive Guide: Powerful and Scalable Data Storage 3rd Edição.
Nosso primeiríssimo esquema😎
Dizem que o primeiro sempre fica: o primeiro beijo💋, o primeiro programa de computador, a primeira língua. Sendo assim, vamos fazer direito. Nosso primeiro esquema abaixo! 😊
Neste esquema, estamos criando um documento que possui vários campos.
constblogSchema=newSchema({title:String,// String is shorthand for {type: String}author:String,body:String,comments: [{body:String,date:Date}],date:{type:Date,default:Date.now},hidden:Boolean,meta:{votes:Number,favs:Number}});
Cada linha define um path, vamos chamar de atributos em PT. Cada atributo tem seu tipo, ou seja, Mongoose é "tipado", como Java. Caso tente chamar tipos diferentes, aparecerá uma mensagem de erro, e não conseguirá salvar;
Na linha 5, temos um vetor de objetos JSON;
Note na linha 6 o uso da palavra default, isso é uma forma de se colocar um valor caso não seja passado nada; Isso pode ser útil em situações onde ter um valor é importante, mesmo que seja um padrão;
Note na linha 8 um objeto dentro de um atributo, deverá ser acessado como meta.votes, como exemplo. Existem algumas desvantagens de se declarar atributos desta forma, ver documentação oficial para mais detalhes!
Criamos nosso esquema. E agora?🤔 Agora precisamos dizer para o Mongoose salvar nosso esquema!
Usamos o comando mongoose.model(modelName, schema).
Onde:
modelNameé o nome do modelo, será salvo internamente no Mongoose, podendo ser acessado como variável global. O padrão é ser sempre maiúsculo, mas não obrigatório;
schemaé o esquema que criamos;
ID
Lembra no "Ligando os motores", testamos os ID, vamos fazer mais alguns testes, como forma de continuar a discussão. Apesar das discussões serem ricas e importantes, nesta primeira edição deste GitBook, não vamos nos aprofundar além disso, pois queremos deixar espaço para falar do Mongoose e dos testes no NestJS!
Vamos fazer dois testes, somente para efeito de discussão.
A linha 4 testa algo muito importante: que o id é um objeto Mongoose. Isso é importante quando usamos populate, ver meu vídeo sobre isso: Usando o populate em mongoose .
Na linha 12, tivemos de modificar comparado com a documentação oficial. Nunca usei path, parece que não funciona.
//Schema.js
const Blog = mongoose.model('Blog', blogSchema);
//Estamos prontos para trabalhar
describe("test 1: Estamos testando se o ID foi adicionado propriamente", () => {
it("O id deve ser adicionado automaticamente", () => {
const doc = { title: "String" }
const esquema = new Blog(doc);
return esquema.save((err, esquema) => {
if (err) return console.error(err);
expect(objectid.isValid(esquema._id)).toBeTruthy();
})
})
})
describe("test 2: Mongoose creates a new _id of type ObjectId to your document.", () => {
it("O id deve ser adicionado automaticamente", () => {
const esquema = new Blog();
expect(esquema._id instanceof mongoose.Types.ObjectId).toBeTruthy();
})
it("Testando id depois de salvar", () => {
const esquema = new Blog();
return esquema.save((err, esquema) => {
if (err) return console.error(err);
expect(esquema._id).toBeTruthy();
})
})
})