插入文档
本课属于 Coddy Node.js 学习旅程的“使用 MongoDB 的数据库”单元。第 5 课,共 29 课。
客户端会在 POST 请求体中发送一本新书,服务器需要将它存储起来,并告知客户端存储了什么。
每个文档都有一个 _id 字段,它是集合中的唯一键。如果你要插入的对象没有这个字段,insertOne 会创建一个,并将它写入同一个对象。调用只会返回 acknowledged 和 insertedId,不会返回文档。insertedId 是 ObjectId,也就是 MongoDB 生成的 ID 类型。通过 ObjectId 查找可以解释这一点。
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); // 相同的 id因此,插入后,你传入的对象就是存储的文档,其中也包括 _id:这正是客户端想要获取的内容。
入门代码使用 insertMany 为三个文档插入种子数据,它接收一个文档数组。insertOne 接收一个文档。两者都是异步写入操作。
挑战
简单现在客户端可以添加书籍了。保存客户端发送的书籍,并将它连同新生成的 id 一起返回。
- 在
server.js中的GET /books下面,添加一个POST /books路由。 - 它会将 JSON 请求体作为新文档存入
books集合。 - 它会返回状态码 201,以及存储后的书籍,其中包含 MongoDB 创建的
_id。对于“试试看”中的请求体,响应如下:你的{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary", "_id": "6720a1f4c2b9e81d3a5f0c14" }_id会有所不同。字段顺序无关紧要。试试看:发送带有以下请求体的POST /books:{ "title": "Beloved", "author": "Toni Morrison", "year": 1987, "isbn": "9781400033416", "genre": "literary" }。你会收到状态码 201 和带有_id的书籍。发送GET /books:你会得到 4 本书,Beloved 排在最后。“Data”选项卡会显示books中有 4 个文档。再次按下“运行”,Beloved 就会消失。每次运行都会从空数据库开始,启动代码会再次存入相同的 3 本书。
亲手试试
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());
// 每个错误都返回 { 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');
});
使用 MongoDB 的数据库中的所有课
自己练习: Express 在线编辑器