node.js - mongodb:如何更新单个文档的嵌套数组项中的多个字段

标签 node.js mongodb

[
  {
    _id: "...",
    title: "some title",
    tasks: [
      { 
        id: "...",
        field1: "abc",
        field2: "def"
      },
      ...
    ]
  },
  ...
]

我想针对给定任务修改 field1 和 field2。我看到很多关于如何更新单个字段的示例,但没有看到如何更新多个字段。

我已尝试以下操作,但它只是用我设置的字段替换整个任务对象。

    let changes = { field1: "123", field2: "456" };

    db.collection("lists")
        .updateOne(
            {   
                "_id": new ObjectId(req.params.listId), 
                "tasks.id": req.params.id 
            },
            { $set: { "tasks.$": changes } }
        );

感谢任何帮助。谢谢。

工作解决方案

    let changes = { field1: "123", field2: "456" };
    Object.keys(changes).forEach(key => {
        changes[`tasks.$.${key}`] = changes[key];
        delete changes[key];
    });
    db.collection("lists")
        .updateOne(
            {   
                "_id": new ObjectId(req.params.listId), 
                "tasks.id": req.params.id 
            },
            { $set: changes }
        );

最佳答案

您必须遵循类似于下面的查询来更新数组内的嵌套文档。您必须为 field1field2 指定单独的名称。这里是 document链接

 db.collection.updateOne(
               {"_id": new ObjectId(req.params.listId),"tasks.id": req.params.id },
               { $set: { "tasks.$.field1":"xyz","tasks.$.field2":"mno" } } )

关于node.js - mongodb:如何更新单个文档的嵌套数组项中的多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61556838/

相关文章:

node.js - Mongoose 无法正确排序数字

javascript - 如何在特定的 URL 中启动 Node.js?

node.js - $first 在 mongodb

node.js - 架构 : Mongoose modelling 中的递归元素

聚合管道期间的 MongoDB String 到 Double 转换

php - 将数据从关系数据库反规范化到非关系数据库的最佳实践

mongodb - mongodb mapreduce中的where条件

json - 如何将带有可变键的json对象保存到mongodb(mongoose)

javascript - 如何使用 Meteor.js 中的 FS.Collection 一次添加更多文件?

node.js - 在 mongoDB 中查询以获取具有不同值和最后添加的记录