首页 > 解决方案 > MongoDB:在嵌套数组中更新

问题描述

我有一个漂亮的小 MongoDB 集合,其中包含以下对象:

{
  "_id" : ObjectId("5919df60adb8170833fb4fa9"),
  "a" : [
    {
      "_id" : ObjectId("5919df60adb8170833fb4faa"),
      "b" : {
        "c" : true,
        "d" : [
          {
            "e" : "cats",
          },
          {
            "f" : "dogs",
          }
        ]
      }
    }
  ]
}

可以通过运行mongo然后运行以下命令来设置它:

use cats
db.wonk.insertOne({"_id":ObjectId("5919df60adb8170833fb4fa9"),"a":[{"_id":ObjectId("5919df60adb8170833fb4faa"),"b":{"c":true,"d":[{"e":"cats",},{"f":"dogs",}]}}]})

我想将 'e' 的值设置为 'meow',但不知道如何查询该对象。我认为以下会找到 e 但没有骰子:

db.wonk.find({a: {  $elemMatch: { 'b': { 'd': { $elemMatch: { 'e': 'cats'  }  }  }  }  }})

我的问题是:如何设置eto的值meow?其他人可以在这个问题上提供的任何帮助将不胜感激!

标签: mongodb

解决方案


您可以在此处使用位置过滤运算符

db.wonk.update({ "_id":ObjectId("5919df60adb8170833fb4fa9") }, 
    { $set: { "a.$[doc1].b.d.$[doc2].e": "meow" } }, 
    { arrayFilters: [ { "doc1._id": ObjectId("5919df60adb8170833fb4faa")  }, { "doc2.e": "cats" } ] })

doc1并且doc2只是一种占位符,然后可以在内部使用arrayFilters来定义 MongoDB 在遍历文档时使用的条件。


推荐阅读