Menu
CoddyTech

Inserindo documentos

Parte da seção Bancos de dados com MongoDB do Journey de Node.js da Coddy. Lição 5 de 29.

Um cliente envia um livro novo no corpo de uma solicitação POST, e o servidor precisa armazená-lo e informar o que armazenou.

Todo documento tem um campo _id, sua chave única na coleção. Quando o objeto que você insere não tem esse campo, insertOne cria um e também o grava nesse mesmo objeto. A chamada retorna apenas acknowledged e insertedId, nunca o documento. insertedId é um ObjectId, o tipo de ID que o MongoDB gera. Encontrar por ObjectId explica isso.

const movie = { title: 'Alien', year: 1979 };
const result = await movies.insertOne(movie);

console.log(result);    // { acknowledged: true, insertedId: new ObjectId('66f1...') }
console.log(movie._id); // o mesmo id

Então, após a inserção, o objeto que você passou é o documento armazenado, incluindo _id: é isso que um cliente quer receber de volta.

O código inicial insere três livros com insertMany, que recebe um array de documentos. insertOne recebe um documento. Ambos são gravações assíncronas.

challenge icon

Desafio

Fácil

Os clientes agora podem adicionar livros. Armazene o livro que um cliente envia e devolva-o com o novo id.

  1. Em server.js, abaixo de GET /books, adicione uma rota POST /books.
  2. Ela armazena o corpo JSON como um novo documento na coleção books.
  3. Ela responde com o status 201 e o livro tal como foi armazenado, incluindo o _id criado pelo MongoDB. Para o corpo em Teste, a resposta é:
    { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }
    Seu _id será diferente. A ordem dos campos não importa. Teste: envie POST /books com este corpo: { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Você recebe 201 e o livro com um _id. Envie GET /books: você recebe quatro livros, com Beloved por último. A aba Data mostra quatro documentos em books. Pressione Executar novamente e Beloved desaparece. Cada execução começa com um banco de dados vazio, e o código inicial armazena os mesmos três livros novamente.

Experimente você mesmo

import express from 'express';
import { MongoClient } from 'mongodb';

const client = new MongoClient('mongodb://localhost:27017');
const db = client.db('shelf');
const books = db.collection('books');

await books.insertMany([
    { title: 'Dune', author: 'Frank Herbert', year: 1965, isbn: '9780441013593', genre: 'scifi' },
    { title: 'Kindred', author: 'Octavia E. Butler', year: 1979, isbn: '9780807083697', genre: 'scifi' },
    { title: 'Emma', author: 'Jane Austen', year: 1815, isbn: '9780141439587', genre: 'classic' },
]);

const app = express();
app.use(express.json());

// Todo erro retorna { error: message }.
function sendError(res, status, message) {
    res.status(status).json({ error: message });
}

app.get('/', (req, res) => {
    res.send('Bookshelf API');
});

app.get('/books', async (req, res) => {
    const list = await books.find().toArray();
    res.json(list);
});

app.listen(3000, () => {
    console.log('Bookshelf is running on port 3000');
});

Todas as lições de Bancos de dados com MongoDB

Pratique por conta própria: Playground de Express