【问题标题】:findOneAndUpdate: using parent and subdocument id to update [duplicate]findOneAndUpdate:使用父文档和子文档 id 更新 [重复]
【发布时间】:2018-10-22 06:02:56
【问题描述】:

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

这是我的尝试:

  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
        ]
    }

【问题讨论】:

  • 你能给我们举一个Book项目的例子吗?
  • 第二种方案有什么问题?
  • @ExplosionPills 刚刚添加了Book的例子,检查问题。
  • @Almaju Woah,实际上并没有什么问题。由于 im forEach:ing 它需要一些时间来完全更新它,所以当页面加载时,我没有看到新结果,因为我认为它还没有完成。但再次刷新后,我确实看到了变化。谢谢你的评论,那时我不会注意到它。顺便说一句,我记得读过一些关于异步/等待的东西。这会解决这个小问题,让它等待加载直到完全完成吗?
  • @ipid 是的,你可以问另一个问题

标签: javascript node.js mongodb express mongoose


【解决方案1】:

类似:

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

【讨论】:

    【解决方案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();
    

    【讨论】:

    • 应该是Book.findOneAndUpdate( { _id: req.params.id, 'chapters._id': req.params.subid }, { $set: {'chapters.$': { 'title': 'new title' } }}).exec();
    猜你喜欢
    • 2017-08-13
    • 2014-02-26
    • 1970-01-01
    • 2019-03-06
    • 2019-07-20
    • 1970-01-01
    • 2022-01-22
    • 2016-10-15
    • 2017-01-27
    相关资源
    最近更新 更多