findOneAndUpdate:使用parent和subdocument id进行更新

时间:2018-05-11 19:08:22

标签: javascript node.js mongodb express mongoose

我想找到正确的子文档并更改特定字段。

以下是我的尝试:

  Book.findOneAndUpdate(
        { _id: req.params.id, chapters: { $elemMatch: { _id: req.params.subid } } },
        { $set: { chapters: { title: 'new title' } } }, { 'new': true }).exec();
    });

也尝试过:

  Book.findOneAndUpdate(
    { _id: req.params.id, 'chapters._id': req.params.subid },
    { $set: { 'title': 'new title' } }, { 'upsert': true }).exec();

第一个解决方案通过使用单个字段title覆盖所有内容来删除所有内容。

如何正确更新?

修改

//Book
    {
        "_id": {
            "$oid": "5ae2f417fe46cf86900af82f"
        },
        "chapters": [
            {                 
                "_id": {
                    "$oid": "5af1b798be6bb05e4427ee65"
                },
               "title": "old title",
               "something": "something"
            },
            //..some more
        ]
    }

2 个答案:

答案 0 :(得分:2)

类似的东西:

const ObjectID = require('mongodb').ObjectID;

var bookId = new ObjectID(req.params.id),
    subId = new ObjectID(req.params.subid);

Book.findOneAndUpdate(
  { _id: bookId, chapters: { $elemMatch: { _id: subId } } },
  { $set: { chapters: { title: 'new title' } } }, { 'new': true }).exec();
});

答案 1 :(得分:2)

认为您需要使用位置运算符$ info

Book.findOneAndUpdate(
    { _id: req.params.id, 'chapters._id': req.params.subid },
    { $set: 'chapters.$': { 'title': 'new title' } }).exec();

或者只更新title

Book.findOneAndUpdate(
    { _id: req.params.id, 'chapters._id': req.params.subid },
    { $set: 'chapters.$.title': 'new title'}).exec();