根据mongoDB中的条件更新嵌套数组中的字段

时间:2019-11-19 07:28:58

标签: node.js mongodb mongoose

我在收藏中有这个结构。如果“语言”为“英语”,我想将“备注”更新为“更好”。

{"Information":[{"id":"5245","details":[{"language":"english","remark":"good","status":"published"},{"language":"hindi","remark":"good","status":"published"},{"language":"arabic","remark":"good","status":"published"}]}],"name":"saroj","company":"visa"}

我能够根据语言从db获取数据的特定部分

db.getCollection("containts").aggregate([
// Filter possible documents
{ "$match": {"$and": [{ "Information.id": "1" },{ "name": "saroj" }]}},

// Unwind the array to denormalize
{ "$unwind": "Information" },
{ "$unwind": "Information.details" },

// Match specific array elements
{ "$match": { "Information.detail.language": "english" } },

// Group back to array form
{ "$group": {
    "_id": "$_id",
    "details": { "$push": "Information.details" }
}}])

输出:

{  "details": [{
  "language": "english",
  "remark": "good",
  "status": "published"
}]}

但是我无法根据“语言”更新“备注”

1 个答案:

答案 0 :(得分:0)

如果您使用的是 mongodb 3.6 及更高版本,则可以使用arrayFilters来更新数组中的元素。 我使用了与您在上面的问题中提到的数组相同的数组,并测试了以下查询,该查询返回更新的文档。

db.collectionName.findOneAndUpdate(
    { "Information.id": "5245", "name": "saroj"},
    { $set : {"Information.$[outer].details.$[elem].remark" : "better"}},
    {   
        returnNewDocument : true,
        arrayFilters: [{"elem.language": "english"},{ "outer.id": "5245"}]
    }
 )

您可以获得有关arrayFilters here的详细说明。

要获得更新的文档,请以猫鼬为例,您可以使用{new : true}代替returnNewDocument: true(在mongodb shell中使用)。