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 idEntã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.
Desafio
FácilOs clientes agora podem adicionar livros. Armazene o livro que um cliente envia e devolva-o com o novo id.
- Em
server.js, abaixo deGET /books, adicione uma rotaPOST /books. - Ela armazena o corpo JSON como um novo documento na coleção
books. - Ela responde com o status 201 e o livro tal como foi armazenado, incluindo o
_idcriado pelo MongoDB. Para o corpo em Teste, a resposta é:Seu{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }_idserá diferente. A ordem dos campos não importa. Teste: enviePOST /bookscom este corpo:{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Você recebe 201 e o livro com um_id. EnvieGET /books: você recebe quatro livros, com Beloved por último. A aba Data mostra quatro documentos embooks. 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
1Documentos
Um livro como documentoColeções e bancos de dadosConectando-se ao MongoDBLendo documentos armazenadosInserindo documentosEncontrando um documentoEncontrando por ObjectIdComparando númerosFiltros de consultaEscolhendo os campos retornadosOrdenando os resultados da consultaMantendo os primeiros resultadosProjeção, ordenação e limitePratique por conta própria: Playground de Express