Definindo seu esquema

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.

const blogSchema = new Schema({
    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!

Desnecessário repetir, estamos nos baseando na documentação oficial!

Criando seu modelo

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;

//Schema.js
const Blog = mongoose.model('Blog', blogSchema);
//Estamos prontos para trabalhar

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.

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();

        })
    })
})

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.

Last updated