Javascript findOneAndUpdate:使用父文档和子文档id更新

Javascript findOneAndUpdate:使用父文档和子文档id更新,javascript,node.js,mongodb,express,mongoose,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.findOneAndU

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

以下是我的尝试:

  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
        ]
    }
比如:

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();
});

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

或仅更新
标题

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

你能给我们举一个
项目的例子吗?第二个解决方案的问题是什么?@ExplosionPills刚刚添加了一个
的例子,检查这个问题。@Almaju Woah,实际上没有什么问题。完全更新它需要一点时间,因为我正在编辑它,所以当加载页面时,我没有看到新的结果,因为我认为它没有完成。但在再次刷新之后,我确实看到了变化。谢谢你的评论,我不会注意到的。顺便说一句,我记得读过一些关于async/wait之类的东西。这会解决这个小问题,让它等待加载直到完全完成吗?@ipid是的,你可能可以问另一个问题,它应该是
Book.findOneAndUpdate({u id:req.params.id,'chapters.\u id':req.params.subid},{$set:{'chapters.$:{'title':'newtitle'}).exec()
Book.findOneAndUpdate(
    { _id: req.params.id, 'chapters._id': req.params.subid },
    { $set: 'chapters.$.title': 'new title'}).exec();