在Mongo数据库中更新嵌套数组对象

时间:2019-03-11 03:44:55

标签: node.js mongodb

这是json对象

{
"account_id":"1",
"sections":[ {
    "section_name":"abc",
    "labels": [{
        "name": "label1",
        "value": "value1"
        },
        {
        "name": "label2",
        "value": "value2"
        }]
    },
     {
    "section_name":"def",
    "labels": [{
        "name": "label3",
        "value": "value3"
        }]
    }]
}

在这个json对象中,我想将def节中的label3的值从value3更改为value4。有不同的帐户,但是我在这里只列出了一个json对象。

我使用了下面的代码,但是对我来说不起作用。在这里,我传递了节名称(section),标签名称(label)和标签值(value)。

let query = {
account_id: event.accountId.toString(),
sections: {
    section_name: section,
    labels: {
    label_name: label
       }
     }
   };

   return using(connectDatabase(), db => {
   return db.collection(TABLE_NAME).updateOne(query, { $set: { 
  'sections.$.labels.$.value': value } });
  }).then(
    result => {
      cb(null, responseObj(result, 200));
    },
    err => {
      cb(responseObj(err, 500));
    }
  );

有人可以帮助我吗?预先感谢

2 个答案:

答案 0 :(得分:1)

要获得预期的结果,请使用以下对嵌套对象使用arrayFilters的选项

  1. 使用account_id获取主要对象
  2. 使用ArrayFiter,$ [identfier] .section:“ def”和$ [identfier] .name:“ label3”

    db.collection(TABLE_NAME).updateOne({ account_id: event.accountId.toString(), { "$set": { "sections.$[elem].labels.$[label].value": value } }, { "arrayFilters": [{ "elem.section_name": section }, { "label.name": label }] } )

请参考此链接以获取更多详细信息-https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/

arrayFilters的另一个示例-How to Update Multiple Array Elements in mongodb

答案 1 :(得分:0)

更新的查询 您可以使用此查询

db.testcol.update(
   { },
   { $set: { "sections.$[element].labels.$[element1].value" : "value1New" } },
   { multi: true,
     arrayFilters: [ { "element.section_name": { $eq: "abc" } },  { "element1.name": { $eq: "label1" } }]
   }
)

您可以检查以下查询:其中1是数组的索引值。

db.testcol.update(
    {
        account_id:"1", 
        "sections.section_name":"def"
    }, 
    {
        $set:{
            "sections.1.labels.1.value":"value8"
        }
    }
) 

如果要更新所有值,则可以使用:

db.testcol.update(
{
    account_id:"1", 
    "sections.section_name":"def"
}, 
{
    $set:{
        "sections.$[].labels.$[].value":"value8"
    }
}

请检查并告诉我是否已满。