简体   繁体   English

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

[英]mongodb: how to update multiple fields in a nested array item of a single document

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

I would like to modify both field1 and field2 for a given task.我想为给定任务修改 field1 和 field2。 I see lots of examples of how to update a single field, but not multiple fields.我看到很多关于如何更新单个字段而不是多个字段的示例。

I've tried the following, but it's simply replacing the whole task object with only the fields I'm setting.我尝试了以下方法,但它只是用我设置的字段替换了整个任务 object。

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

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

Appreciate any help.感谢任何帮助。 Thanks.谢谢。

WORKING SOLUTION工作解决方案

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

You have to follow query something similar like below to update the nested document inside an array.您必须按照类似下面的查询来更新数组内的嵌套文档。 You have to give separate names for field1 and field2 .Here is the document link您必须为field1field2提供单独的名称。这是文档链接

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM