Menu
CoddyTech

Wstawianie dokumentów

Część sekcji Bazy danych z MongoDB ścieżki Node.js w Coddy. Lekcja 5 z 29.

Klient wysyła nową książkę w treści żądania POST, a serwer musi ją zapisać i poinformować, co zapisał.

Każdy dokument ma pole _id, czyli swój unikalny klucz w kolekcji. Jeśli wstawiany obiekt go nie ma, insertOne tworzy je i zapisuje również w tym samym obiekcie. Wywołanie zwraca tylko acknowledged i insertedId, nigdy dokument. insertedId to ObjectId, czyli rodzaj identyfikatora generowanego przez MongoDB. Wyszukiwanie po ObjectId wyjaśnia tę kwestię.

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); // to samo id

Zatem po wstawieniu przekazany obiekt jest zapisanym dokumentem, łącznie z polem _id: właśnie to klient chce otrzymać z powrotem.

W kodzie początkowym za pomocą insertMany dodawane są trzy książki. Metoda ta przyjmuje tablicę dokumentów. insertOne przyjmuje jeden dokument. Obie metody wykonują asynchroniczne zapisy.

challenge icon

Wyzwanie

Łatwy

Klienci mogą teraz dodawać książki. Zapisz książkę przesłaną przez klienta i odeślij ją z nowym identyfikatorem.

  1. W pliku server.js, poniżej GET /books, dodaj trasę POST /books.
  2. Zapisuje ona treść JSON jako nowy dokument w kolekcji books.
  3. Odpowiada statusem 201 i książką w postaci, w jakiej została zapisana, włącznie z utworzonym przez MongoDB polem _id. Dla treści użytej w opcji „Wypróbuj” odpowiedź wygląda tak:
    { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }
    Twoje _id będzie inne. Kolejność pól nie ma znaczenia. Wypróbuj: wyślij POST /books z następującą treścią: { "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Otrzymasz status 201 i książkę z polem _id. Wyślij GET /books: otrzymasz cztery książki, a Beloved będzie ostatnia. Karta Dane pokazuje cztery dokumenty w kolekcji books. Naciśnij ponownie „Uruchom”, a Beloved zniknie. Każde uruchomienie rozpoczyna się od pustej bazy danych, a kod początkowy ponownie zapisuje te same trzy książki.

Spróbuj swoich sił

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

// Każdy błąd zwraca odpowiedź { 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');
});

Wszystkie lekcje w sekcji Bazy danych z MongoDB

Poćwicz samodzielnie: Edytor online Express