Menu
CoddyTech

插入文档

本课属于 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 接收一个文档。两者都是异步写入操作。

challenge icon

挑战

简单

现在客户端可以添加书籍了。保存客户端发送的书籍,并将它连同新生成的 id 一起返回。

  1. 在 server.js 中的 GET /books 下面,添加一个 POST /books 路由。
  2. 它会将 JSON 请求体作为新文档存入 books 集合。
  3. 它会返回状态码 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 在线编辑器