Como usar MongoDB com Node.js

Node.js

Neste tutorial vou mostrar como interagir com uma base de dados MongoDB com Node.js.

Mongoose

Vamos usar o pacote mongoosejs. Se você já tem um projeto Node.js no qual você está trabalhando, instale-o usando:

$ npm install mongoose

Se você estiver começando do zero, você pode dar uma olhada no minha introdução sobre Node.js ou comece criando uma nova pasta, e com seu terminal dentro da pasta, execute o comando npm init -y para iniciar um novo projeto Node.js, e então execute o comando npm install mongoose.

Conectando ao MongoDB

Crie um novo arquivo server.js. Você primeiro vai precisar do pacote mongoose no seu projeto.

const mongoose = require('mongoose');

Crie um URL para o servidor MongoDB. Se você estiver usando MongoDB localmente, a URL será algo como mongodb://localhost:27017, 27017 é a porta padrão do MongoDB. E crie uma outra variável com o nome do seu banco de dados.

O pacote vem com um método chamado connect() que vai nos ajudar na conexão com MongoDB. Vamos usar esse método para criar uma instância do banco de dados.

const mongoose = require('mongoose');
const server = 'mongodb://localhost:27017'
const database = 'myDatabase';
mongoose.connect(`${server}/${database}`,
   { useNewUrlParser: true, useUnifiedTopology: true }
);

O pacote Mongoose tem algumas depreciações no projeto, devido a mudanças no MongoDB, por isso precisamos usar as flags {useNewUrlParser: true, useUnifiedTopology: true }, se quiser ver mais detalhes, basta clicar aqui.

Podemos então testar se a conexão foi bem sucedida ou não.

const mongoose = require('mongoose');
const server = 'mongodb://localhost:27017'
const database = 'myDatabase';
mongoose.connect(`${server}/${database}`,
   { useNewUrlParser: true, useUnifiedTopology: true }
).then(() => {
   console.log("Successfully connect to MongoDB.");
})
   .catch(err => {
      console.error("Connection error", err);
      process.exit();
   });

No terminal, rode o comando node server.js. Você dever ver essa mensagem no seu terminal:

Successfully connect to MongoDB.

Criando uma coleção

Tudo em mongoose começa com um Schema. Cada esquema mapeia para uma coleção. Coleções são uma das estruturas básicas do MongoDB. MongoDB define a forma dos documentos dentro dessa coleção.

  const Schema = mongoose.Schema;
  const UserSchema = new Schema({
    name:  String
  });

Criando um documento

Uma instância de um model é chamado de documento. Vamos então utilizar o nosso método model() para criar nosso documento.

const User = mongoose.model('User', UserSchema);

O primeiro argumento é o nome singular da coleção para a qual seu modelo está destinado. O segundo argumento, é o objeto Schema da nossa coleção que definimos antes, UserSchema.

Mongoose vai procurar automaticamente a versão plural, em letras minúsculas, do nome do seu modelo.

Inserindo dados em um documento

Com o nosso documento User criado, salvar os dados no banco de dados é simples. Vamos criar uma nova instância do documento e passar os dados que queremos inserir, no nosso exemplo, o nosso model aceita apenas o atributo name. Podemos então utilizar o método save() diretamente no nosso model para persistir os dados.

const user = new User({ name: 'John' });
user.save()
   .then(() => console.log('User Created'))
   .catch(() => console.log('User model Error'))

Você pode testar usando o comando, node server.js no seu terminal. Você deve ver essa mensagem.

Successfully connect to MongoDB.
User Created

Você pode adicionar vários itens usando o método create(), passando um Array como primeiro parâmetro. Esse método executa o método save() para cada item do Array.

const userArray = [{ name: 'Alice' }, { name: 'Paul' }]
User.create(userArray)
   .then(() => console.log('User Created'))
   .catch(() => console.log('User model Error'))

Encontre todos os documentos de uma coleção

Mongoose tem um método muito simples pra resolver isso. Com o método find() sendo chamado no seu modelo, você consegue recuperar todos os documentos da sua coleção.

User.find()
   .then(users => { console.log(users) })
   .catch(error => { console.log("User Find Error", error) })

O seu resultado no terminal após rodar o comando node server.js deve ser algo assim:

Successfully connect to MongoDB.
[ { _id: '5f05a2b58415d87a550de613', name: 'Alice', __v: 0 },
  { _id: '5f05a2b58415d87a550de614', name: 'Paul', __v: 0 },
  { _id: '5f05a4c99f222e7e9c96d825', name: 'John', __v: 0 } ]

Encontre um documento específico

Você consegue filtrar os documentos passando a lista de parâmetros dentro do método find(). Esse processo é parecido com o WHERE do SQL.

Como temos apenas um atributo nos nossos documentos, vamos filtrar pelo nome de cada usuário.

User.find({ name: 'John' })
   .then(user => { console.log(user); })
   .catch(error => { console.log("User Find Error", error) })

E o seu resultado deve ser esse:

Successfully connect to MongoDB.
[ { _id: '5f05a4c99f222e7e9c96d825', name: 'John', __v: 0 } ]

Se você precisar encontrar mais de um documento você pode usar o operador $in.

User.find({ name: { $in: ['John', 'Paul'] } })
   .then(users => { console.log(users); })
   .catch(error => { console.log("User Find Error", error) })
Successfully connect to MongoDB.
[ { _id: '5f05a2b58415d87a550de614', name: 'Paul', __v: 0 },
  { _id: '5f05a4c99f222e7e9c96d825', name: 'John', __v: 0 } ]

Atualizar um documento existente

Abaixo está um exemplo de como usar save() para atualizar o nome do usuário.

async function update(name, newName) {
   try {
      const user = await User.findOne({ name: name });
      if (user) {
         user.name = newName;
         await user.save();
         console.log('User Updated');
      }
      console.log('User not Found!');
      return;
   } catch (error) {
      console.log('Update Error', error);
      return;
   }
}
update('Paul', 'Peter');

Este simples exemplo tem algumas nuances. Primeiro, o método save() é um método de um documento, o que significa que você deve ter um documento para utiliza-lo. Você precisa usar o método create() ou usar find() para obter um documento.

Estou utilizando o método findOne() por que ele retorna apenas um documento, o método find() retorna um Array, mesmo que encontre apenas uma correspondência.

Em segundo lugar, os documentos têm rastreamento de mudanças. Quando você chama doc.save(), Mongoose sabe que você alterou a propriedade name e transforma sua chamada save() em updateOne({ $set: { name } }).

Se prefere usar Promises, você pode eliminar o uso da função, fazendo assim:

User.findOne({ name: "Paul" })
   .then(user => {
      if (user) {
         user.name = 'Peter';
         user.save();
         console.log('User Updated');
      }
      console.log('User not Found!');
   })
   .catch(error => {
      console.log('Update Error', error);
   })

Deletando um documento

O método que vamos usar é o deleteOne(), esta método chama a função Collection#deleteOne() do MongoDB Driver. A promise devolvida resolve para um objeto que contém 3 propriedades:

  • ok: 1 se não ocorrerem erros
  • deletedCount: o número de documentos deletados
  • n: o número de documentos deletados. Igual a deletedCount.
User.deleteOne({ name: 'John' })
   .then(response => { console.log(response) })
   .catch(error => { console.log('Delete Error', error); })

O resultado desse nosso exemplo no terminal:

{ n: 1, ok: 1, deletedCount: 1 }

Finalizando a conexão

Uma vez terminadas as operações, podemos chamar o método de close():

mongoose.connection.close();

Se gostou desse artigo, não deixe de se inscrever na newsletter e fique informado sempre que tiver conteúdo novo!

E se ainda ficou alguma dúvida, ou se você tiver alguma sugestão, você pode deixar o seu comentário logo aqui em abaixo! Até a próxima.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

0 Comments