【问题标题】:Mongoose - Push value to array which is nested in object which is nested in arrayMongoose - 将值推送到嵌套在对象中的数组,该对象嵌套在数组中
【发布时间】:2022-01-23 01:01:56
【问题描述】:

不幸的是,我只能在 stackoverflow 上找到非常具体的问题,并且在文档中没有确切的详细信息,所以这里有一个更通用的示例,也可能对其他人有所帮助。

我只想给对象中带有“title:'title3”的数组(arr)添加一个值。

{
_id: <id>,
prop1: val1,
prop2: val2,
prop3: [
    {
        title: 'title1',
        arr: ['val1', 'val2', 'val3'],
    },
    {
        title: 'title2',
        arr: ['val1', 'val2', 'val3'],
    },
    {
        title: 'title3',
        arr: ['val1', 'val2', 'val3'], //only update this array
    }
]
}

我目前的做法是这样的:

SomeModel.findOneAndUpdate(
    { _id: id, "prop3.title": "title3" },
    {$push: { "prop3.$[].arr": someDoc._id.toString() }}, 
    (err, doc) => {
        if (err) {
            console.log('Error updating doc: ', err);
            resolve(false);
        } else {
            resolve(doc);
        }
    }
);

但是,这里的问题是,不仅在标题为“title3”的对象的数组中添加了一个值,而且在任何地方都添加了一个值。

如何将一个值专门添加到标题值为“title3”的对象中的数组? 我也非常感谢提供解释这一点的文档链接。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    您可以通过这种方式使用位置$ 运算符在单个操作中完成:

    使用$ 告诉mongo“更新在查找阶段找到的对象”。在这种情况下,“更新prop3.titletitle3 的对象”。

    请注意,您使用的是arrayFilters,而不是位置运算符。

    db.collection.update({
      "_id": 1,
      "prop3.title": "title3"
    },
    {
      "$push": {
        "prop3.$.arr": "val4"
      }
    })
    

    例如here

    【讨论】:

    • 非常感谢你,这正是我想要的
    【解决方案2】:

    这是一种解决方案,在您的整个上下文中可能有意义,也可能没有意义。

    使用mongoose Document.save() 方法会更幸运。获得文档的本地副本后,您可以简单地推送到数组:

    const doc = await SomeModel.findOne({
        _id: id, 
        "prop3.title": "title3" 
    });
    
    doc.prop3[3].arr.push(item);
    await doc.save();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 2017-01-22
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多