代码之家  ›  专栏  ›  技术社区  ›  duhaime

MongoDB:在嵌套数组中更新

  •  1
  • duhaime  · 技术社区  · 7 年前

    我有一个漂亮的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'  }  }  }  }  }})
    

    我的问题是:如何设置 e meow ? 如果其他人能在这个问题上提供任何帮助,我们将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  2
  •   mickl    7 年前

    positional filtered operator 在这里:

    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在遍历文档时使用的条件。