by Nick Karnik

Mongoose is an Object Data Modeling (ODM) library for MongoDB and Node.js. Ele gerencia relações entre dados, fornece validação esquema, e é usado para traduzir entre objetos em código e a representação desses objetos em MongoDB.

Object Mapping between Node and MongoDB managed via Mongoose

MongoDB is a schema-less NoSQL document database., Isso significa que você pode armazenar documentos JSON nele, e a estrutura desses documentos pode variar, uma vez que não é aplicada como bases de dados SQL. Esta é uma das vantagens do uso de NoSQL como ele acelera o desenvolvimento de aplicações e reduz a complexidade dos implementos.

Abaixo está um exemplo de como os dados são armazenados em Mongo vs. Banco de dados SQL:

NoSQL Documentos vs., As tabelas relacionais em SQL

terminologias

Colecções

‘Colecções’ em Mongo são equivalentes às tabelas em bases de dados relacionais. Podem guardar vários documentos do JSON.

documentos

“documentos” são equivalentes a registos ou linhas de dados em SQL. Enquanto uma linha SQL pode referenciar dados em outras tabelas, os documentos Mongo geralmente combinam isso em um documento.

os campos

‘campos’ ou atributos são semelhantes às colunas de uma tabela SQL.

esquema

enquanto Mongo é sem esquema, SQL define um esquema através da definição da tabela., Um esquema de mangusto é uma estrutura de dados de documentos (ou forma do documento) que é aplicada através da camada de Aplicação.

modelos

‘modelos’ são construtores de ordem superior que tomam um esquema e criam uma instância de um documento equivalente a registros em uma base de dados relacional.

iniciando

instalação Mongo

Antes de começarmos, vamos configurar Mongo., Você pode escolher uma das seguintes opções (estamos usando a opção #1 para este artigo):

  1. Download apropriado MongoDB versão para o seu Sistema Operacional a partir do MongoDB Site e siga as instruções de instalação
  2. Crie gratuitamente um banco de dados de caixa de areia de inscrição no mLab
  3. Instalar Mongo usando a janela de Encaixe se você preferir usar a janela de encaixe

Vamos navegar através de alguns dos princípios básicos do Mangusto através da implementação de um modelo que representa os dados de um sistema simplificado de livro de endereços.

I am using Visual Studio Code, Node 8.9, and NPM 5.6., Acenda o seu IDE favorito, crie um projeto em branco, e vamos começar! Vamos usar a sintaxe ES6 limitada no nó, para não configurarmos o Babel.

NPM Install

Let’s go to the project folder and initialize our project

npm init -y

Let’s install Mongoose and a validation library with the following command:

npm install mongoose validator

The above install command will install the latest version of the libraries. A sintaxe do mangusto neste artigo é específica para Mangusto v5 e mais além.,

ligação à base de dados

criar um ficheiro ./src/database.js sob a raiz do projecto.a seguir, adicionaremos uma classe simples com um método que se conecta à base de dados.

o seu texto de ligação irá variar com base na sua instalação.

o require(‘mongoose’) a chamada acima devolve um objecto Singleton. Significa que a primeira vez que você chama require(‘mongoose’), ele está criando uma instância da classe Mangusto e retornando-A., Em chamadas subsequentes, ele retornará a mesma instância que foi criada e devolvida a você pela primeira vez por causa de como o módulo importação/exportação funciona no ES6.

Módulo de importação/exigir do fluxo de trabalho

da mesma forma, fizemos a nossa classe de Banco de dados em um singleton por retornar uma instância da classe module.exports declaração, porque nós só precisamos de uma única conexão para o banco de dados.,

ES6 torna muito fácil para nós criar um padrão singleton (instância única) por causa de como o carregador de módulos funciona, cache a resposta de um arquivo anteriormente importado.

esquema de Mangusto vs. modelo

um modelo de mangusto é um invólucro no esquema de Mangusto. Um esquema de Mangusto define a estrutura do documento, valores padrão, validadores, etc., enquanto que um modelo Manguose fornece uma interface para a base de dados para criar, pesquisar, atualizar, apagar registros, etc.a criação de um modelo de Mangusto compreende principalmente três partes:

1., Referenciando Mangusto

let mongoose = require('mongoose')

Esta referência será a mesma que foi devolvida quando nos conectamos à base de dados, o que significa que as definições de esquemas e modelos não precisarão se conectar explicitamente à base de dados.2. Definindo o esquema

um esquema define propriedades do documento através de um objecto onde o nome da chave corresponde ao nome da propriedade na colecção.,

let emailSchema = new mongoose.Schema({ email: String})

aqui definimos uma propriedade chamada email com um tipo de esquema String que mapeia para um validador interno que será despoletado quando o modelo for gravado na base de dados. Ele vai falhar se o tipo de dados do valor não é um tipo de string.

Os seguintes Tipos de Esquema são permitidas:

  • Array
  • Boolean
  • Buffer
  • Data
  • Misto (genérico / flexível tipo de dados)
  • Número
  • ObjectId
  • String

Misto e ObjectId são definidos abaixo de require(‘mongoose’).Schema.Types.

3., Exportando um modelo

precisamos chamar o construtor do modelo na instância Mangusto e passar-lhe o nome da coleção e uma referência à definição do esquema.

module.exports = mongoose.model('Email', emailSchema)

Vamos combinar o código acima no ./src/models/email.js para definir o conteúdo de um e-mail modelo:

A definição do esquema deve ser simples, mas sua complexidade é geralmente baseada nas exigências da aplicação. Os esquemas podem ser reutilizados e podem conter vários esquemas de crianças também. No exemplo acima, o valor da propriedade de E-mail é um tipo de valor simples., No entanto, também pode ser um tipo de objeto com propriedades adicionais sobre ele.

podemos criar uma instância do modelo definido acima e preenchê-lo usando a seguinte sintaxe:

let EmailModel = require('./email')let msg = new EmailModel({ email: '[email protected]'})

Vamos melhorar o e-Mail de esquema para fazer o e-mail de propriedade de um único campo obrigatório e converter o valor para minúsculas antes de salvá-lo. Também podemos adicionar uma função de validação que irá garantir que o valor é um endereço de E-mail válido. Vamos consultar e usar a biblioteca de validação instalada anteriormente.,

Operações Básicas

Mangusto tem uma API flexível e fornece muitas maneiras de realizar uma tarefa. Não vamos nos concentrar nas variações porque isso está fora de escopo para este artigo, mas lembre-se que a maioria das operações podem ser feitas de mais de uma forma sintática ou através da arquitetura de Aplicação.,

Criar Registo

Vamos criar uma instância do e-mail modelo e salvá-lo para o banco de dados:

O resultado é um documento que é retornado depois de guardar:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }

os campos A seguir são retornadas (campos internos são prefixados com um carácter de sublinhado):

  1. _id campo é gerado automaticamente pelo Mongo e é a chave primária da coleção. O seu valor é um identificador único para o documento.
  2. o valor do campoemail é devolvido., Notice that it is lower-cased because we specified the lowercase:true attribute in the schema.
  3. __v é a propriedade versionKey definida em cada documento quando criado pela primeira vez por Mangusto. O seu valor contém a revisão interna do documento.

Se tentar repetir a operação de gravação acima, irá obter um erro porque especificámos que o campo de E-mail deve ser único.

obter o registo

vamos tentar recuperar o registo que gravámos na base de dados mais cedo., A classe modelo expõe vários métodos estáticos e de instância para realizar operações no banco de dados. Vamos agora tentar encontrar o registro que criamos anteriormente usando o método find e passar o e-mail como o termo de busca.

EmailModel .find({ email: '[email protected]' // search query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })

O documento retornado será semelhante ao que foi apresentado quando criamos o registro de:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }

Actualização de Registo

Vamos modificar o registro acima, alterando o endereço de e-mail e adicionar outro campo para ele, tudo em uma única operação., Por motivos de desempenho, o Mangusto não devolver o documento atualizado, então nós precisamos passar um parâmetro adicional para perguntar para ele:

O documento retornado irá conter atualizados e-mail:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }

Excluir Registro

Vamos usar o findOneAndRemove chamada para excluir um registro., Ele retorna o documento original que foi removido:

Ajudantes

temos de analisar algumas das funcionalidades básicas acima conhecidas como CRUD (Criar, Ler, Atualizar, Excluir) de operações, mas Mangusto também fornece a capacidade para configurar vários tipos de auxiliar de métodos e propriedades. Estes podem ser usados para simplificar ainda mais o trabalho com dados.

Vamos criar um esquema de usuário no ./src/models/user.js com os camposfirstName e lastName:

Propriedade Virtual

Uma propriedade virtual não é mantida no banco de dados., Podemos adicioná-lo ao nosso esquema como um auxiliar para obter e definir valores.

Vamos criar uma propriedade virtual chamado fullName que pode ser utilizado para definir valores firstName e lastName e recuperá-los como um valor combinado quando ler:

Retornos de chamada para get e set devem utilizar a função de palavra-chave como precisamos de acesso para o modelo através de this palavra-chave. O uso de funções fat arrow irá alterar o que this se refere.,

Agora, podemos definir firstName e lastName atribuindo um valor para fullName:

O código acima irá produzir o seguinte:

{ _id: 5a7a4248550ebb9fafd898cf, firstName: 'Thomas', lastName: 'Anderson' } Thomas Anderson

Métodos de Instância

podemos criar métodos auxiliares no esquema e acessá-los através do modelo de instância. Estes métodos terão acesso ao objeto modelo e podem ser utilizados de forma bastante criativa. Por exemplo, poderíamos criar um método para encontrar todas as pessoas que têm o mesmo nome que a instância atual.,

neste exemplo, vamos criar uma função para devolver as iniciais para o usuário atual. Vamos adicionar um costume método auxiliar chamado de getInitials no esquema:

userSchema.methods.getInitials = function() { return this.firstName + this.lastName}

Este método será acessível através de um modelo de exemplo:

Métodos Estáticos

Semelhante aos métodos de instância, podemos criar métodos estáticos no esquema., Vamos criar um método para recuperar todos os usuários no banco de dados:

Chamar getUsers no Modelo de sala de aula irá retornar todos os usuários no banco de dados:

UserModel.getUsers() .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })

a Adição de instância e métodos estáticos é uma boa abordagem para implementar uma interface para interações com banco de dados em coleções e registros.

Middleware

Middleware são funções que funcionam em estágios específicos de uma conduta., Mangusto suporte de middleware para as operações a seguir:

  • Agregação
  • Documento
  • Modelo
  • Consulta

Por exemplo, que os modelos de pre e post funções de dois parâmetros:

  1. Tipo de evento (‘init’, ‘validar’, ‘guardar’, ‘remover’)
  2. Um retorno de chamada que é executada com essa referência o modelo de exemplo
Exemplo de Middleware (uma.k.um., pré e pós-ganchos)

Vamos tentar um exemplo adicionando dois campos chamados de createdAt e updatedAt ao nosso esquema:

Quando model.save() é chamado, há um pre(‘save’, …) e post(‘save’, …) evento é acionado. Para o segundo parâmetro, você pode passar uma função que é chamada quando o evento é despoletado. Estas funções levam um parâmetro para a próxima função na cadeia de middleware.,

Vamos adicionar um pré-salvar gancho e definir valores para createdAt e updatedAt:

Vamos criar e salvar o nosso modelo:

Você deve ver o valor de createdAt e updatedAt quando o registo que é criado é impresso:

Plugins

Suponha que queremos para controlar quando um registro foi criada e atualizada por último sobre cada coleção em nossa base de dados. Em vez de repetir o processo acima, podemos criar um plugin e aplicá-lo a cada esquema.,

Vamos criar um arquivo ./src/model/plugins/timestamp.js e replicar as funcionalidades acima como um módulo reutilizável:

Para usar este plugin, basta passá-lo para os esquemas que deve ser dada esta funcionalidade:

de Construção de Query

o Mangusto tem uma rica API que trata de muitas e complexas as operações suportadas pelo MongoDB. Considere uma consulta onde podemos incrementalmente construir componentes de consulta.,

neste exemplo, vamos:

  1. Localizar todos os usuários
  2. Ignorar os 100 primeiros registros
  3. Limitar os resultados a 10 registros
  4. Ordenar os resultados pelo nome do campo
  5. Seleccione o nome
  6. Executar essa consulta

Fechar

Nós mal arranhamos a superfície explorar alguns dos recursos do Mangusto. É uma rica biblioteca cheia de recursos úteis e poderosos que fazem com que seja uma alegria trabalhar com modelos de dados na camada de Aplicação.,

embora possa interagir directamente com o Mongo usando o controlador Mongo, este simplificará essa interacção, permitindo-lhe modelar as relações entre os dados e validá-los facilmente.fato divertido: mangusto é criado por Valeri Karpov, que é um engenheiro incrivelmente talentoso! Ele cunhou o termo “pilha má”.se este artigo foi útil ??? e Segue-me no Twitter.

you may also like my workshop on youtube: How to Build a REST API with Node | Express / Mongo