在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 }
答案 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"] }}}
);