更新文档内部的嵌套集合-MongoDB

时间:2019-08-22 18:19:02

标签: mongodb mongodb-query

在Mongo中提供以下文档:

{ 
    "_id" : ObjectId("5d5e9852b2b803bfc66e74a6"), 
    "name" : "NAME", 
    "collection1" : [ 
        { "type" : "TYPE", "collection2" : [ ] } 
    ] 
}

我想在 collection2 属性中添加元素。我正在使用mongo控制台。

我尝试使用此查询:

db.mycollection.updateOne(
{"name": "NAME"}, 
{$addToSet: {"collection1.$[element].collection2" : { $each: ["a", "b", "c"]}}}, 
{arrayFilters: [{element: 0}]}
);

我也尝试使用push,但没有成功。

控制台返回:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }

2 个答案:

答案 0 :(得分:1)

由于arrayFilters子句与文档不匹配,因此更新没有更新文档。具体来说,您的示例正在筛选collection1中定义为0的元素,该元素不存在。

更改要过滤的更新collection2为空数组应导致更新按预期工作:

db.test.insert({
...     "_id" : ObjectId("5d5e9852b2b803bfc66e74a6"),
...     "name" : "NAME",
...     "collection1" : [
...         { "type" : "TYPE", "collection2" : [ ] }
...     ]
... })

db.test.update(
... { name: "NAME" },
... { "$addToSet": { collection1.$[element].collection2: { "$each" : [ "a", "b", "c" ] } } },
... { arrayFilters: [ { element.collection2: [ ] } ] }
... )

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

db.test.find()
{ "_id" : ObjectId("5d5e9852b2b803bfc66e74a6"), "name" : "NAME", "collection1" : [ { "type" : "TYPE", "collection2" : [ "a", "b", "c" ] } ] }

答案 1 :(得分:1)

如果您知道collection1元素的索引,则可以省略arrayFilters而只使用索引

db.mycollection.updateOne(
    { "name": "NAME" }, 
    { $addToSet: { "collection1.0.collection2": { $each: ["a", "b", "c"] }}}
);