Chèn tài liệu
Thuộc phần Cơ sở dữ liệu với MongoDB trong hành trình Node.js của Coddy. Bài học 5 trên 29.
Ứng dụng khách gửi một cuốn sách mới trong phần thân của yêu cầu POST, máy chủ phải lưu cuốn sách đó và cho biết mình đã lưu gì.
Mỗi tài liệu có trường _id, khóa riêng biệt của tài liệu đó trong bộ sưu tập. Khi đối tượng bạn chèn chưa có trường này, insertOne sẽ tạo trường đó và ghi vào chính đối tượng ấy. Lời gọi chỉ trả về acknowledged và insertedId, chứ không trả về tài liệu. insertedId là một ObjectId, loại mã định danh mà MongoDB tạo ra. Tìm tài liệu bằng ObjectId sẽ giúp bạn hiểu rõ hơn.
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); // cùng một idVì vậy, sau khi chèn, đối tượng bạn truyền vào chính là tài liệu đã lưu, bao gồm cả _id: đó là thứ ứng dụng khách muốn nhận lại.
Mã khởi đầu tạo sẵn ba cuốn sách bằng insertMany, phương thức này nhận một mảng tài liệu. insertOne nhận một tài liệu. Cả hai đều là thao tác ghi bất đồng bộ.
Thử thách
DễGiờ đây, client có thể thêm sách. Lưu cuốn sách client gửi và gửi lại sách đó cùng với id mới.
- Trong
server.js, bên dướiGET /books, thêm một routePOST /books. - Route này lưu phần thân JSON thành một document mới trong collection
books. - Route phản hồi với trạng thái 201 và cuốn sách như khi được lưu, bao gồm
_iddo MongoDB tạo. Với phần thân trong mục Try it, phản hồi là:{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }_idcủa bạn sẽ khác. Thứ tự các trường không quan trọng. Thử ngay: GửiPOST /booksvới phần thân này:{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }. Bạn nhận được trạng thái 201 và cuốn sách có_id. GửiGET /books: bạn nhận được bốn cuốn sách, trong đó Beloved ở cuối. Tab Data hiển thị bốn document trongbooks. Nhấn Run lần nữa, Beloved sẽ biến mất. Mỗi lần Run đều bắt đầu với cơ sở dữ liệu trống, và code khởi đầu lưu lại ba cuốn sách ban đầu.
Tự làm thử
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());
// Mọi lỗi đều trả về { 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');
});
Tất cả bài học trong Cơ sở dữ liệu với MongoDB
Tự luyện tập: Playground Express