我可以在一个声明中合并$ pushAll和$ inc吗?
在结合之前,这很好用:
db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});
db.test.update({"name":"albert"},
{"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});
db.test.update({"name":"albert"},
{"$inc" : {"bugs.0.count" : 1}});
db.test.update({"name":"albert"},
{"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}});
但是当我尝试这样组合时:
db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});
db.test.update({"name":"albert"},
{"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});
db.test.update({"name":"albert"},
{
"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]},
"$inc" : {"bugs.0.count" : 1}
}
);
发生此错误:
have conflicting mods in update
我想知道有可能做到这一点,而且,我想象的不仅仅是pushAll和inc,但我不确定这是否得到支持?
我在一个数组的不同元素上尝试了多个$ inc,它有效(尽管不正确。引用下面的答案来澄清为什么这个doensnt运行良好且有效:The correct way to increment both fields is as follows: > db.test.update({"name":"albert"}, {"$inc" : {"bugs.0.count" : 1, "bugs.1.count" : 1}})
:
db.test.update({"name":"albert"},
{
"$inc" : {"bugs.0.count" : 1},
"$inc" : {"bugs.1.count" : 1}
}
);
$ set和$ inc在数组的不同元素上的组合也有效:
db.test.update({"name":"albert"},
{
"$set" : {"bugs.0.test" : {"name" : "haha"}},
"$inc" : {"bugs.0.count" : 1},
"$inc" : {"bugs.1.count" : 1}
}
);
但是将这些中的任何一个与$ push或$ pushAll结合起来,都会出错。
所以,我目前的结论是,它不是关于同一阵列中多个元素的多个操作是问题,但将这些操作与$ push或$ pushAll组合可以改变阵列是问题。
答案 0 :(得分:21)
可以对同一文档执行多次更新,只要这些更新不冲突(因此“更新中存在冲突的mod”错误)。
因为“$ push”:{“bugs”:[{“name”:“bug1”,“count”:1}]}和“$ inc”:{“bugs.0.count”:1}是两者都试图修改文档的相同部分(即“错误”数组),它们发生冲突。
如果每个更新都影响文档的不同部分,则可以合并多个更新:
例如:
> db.test.drop()
true
> db.test.save({ "_id" : 1, "name" : "albert", "bugs" : [ ] })
> db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}, "$inc" : {"increment" : 1}, $set:{"note":"Here is another field."}})
> db.test.find()
{ "_id" : 1, "bugs" : [ { "name" : "bug1", "count" : 1 } ], "increment" : 1, "name" : "albert", "note" : "Here is another field." }
>
更新包含三个不同的操作($ pushAll,$ inc和$ set),但能够成功完成,因为每个操作都会影响文档的不同部分。
我意识到这并不是您希望做的事情,但希望它能让您更好地了解更新的工作原理,并提供一些有关如何重新构建更新和/或文档以执行更新的建议。您的应用程序所需的功能。祝好运。