如何首先将 Model.updateOne() 转换为 Model.findOne() 然后 Model.set() 然后 Model.save()

How to convert Model.updateOne() to Model.findOne() first then Model.set() then Model.save()

我有一个 mongodb 人物文档 是这样的:

[
 {
    _id: "1234567890",
    name: "El Wood",
    jobs: [
       {
          _id: "job1",
          title: "teacher"
       },
       {
          _id: "job2",
          title: "programmer"
       }

    ]
 },
 ...
]

我想更新(更新一个)job1 title 从 teacherlecturer.

我正在使用 express 和 mongoose。

我的第一个方法是:

await People.updateOne({ "jobs._id": "job1" }, { $set: { "jobs.$.title": "lecturer" } });

上面的代码是有效的。

我的第二个方法是先findOne(),再set(),再save():

const peopleToUpdate = await People.findOne({ "jobs._id": "job1" }) // 
peopleToUpdate.set({ "jobs.$.title": "lecturer" })
peopleToUpdate.save()

但是第二种方法不起作用,job1 的标题没有改变。

如何使用第二种方法更新 job1 的标题?

发生这种情况是因为您使用的是异步。 要使用第二种方法,您需要使用 promises

const peopleToUpdate = await People.findOne({ 'jobs._id': 'job1' })
    .then(function (doc) {
        doc.title = 'lecturer';
        return doc.save();
    })
    .then(console.log)
    .catch(function (err) {
        handleError(err);
    });

请阅读这些文档作为参考

https://mongoosejs.com/docs/async-await.html#basic-use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise