Mongodb 在一条语句中使用多个mongo update运算符?
我可以将$pushAll和$inc合并到一个语句中吗 在联合收割机之前,这可以正常工作:Mongodb 在一条语句中使用多个mongo update运算符?,mongodb,Mongodb,我可以将$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":"albe
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,但我不确定这是否得到支持
更新日期:2012年3月23日 我在一个数组的不同元素上尝试了多个$inc,它可以工作(虽然不正确。从下面的答案中引用,以澄清为什么它不能很好地工作以及什么工作:
增加这两个字段的正确方法如下:>db.test.update({“name”:“albert”},{“$inc”:{“bugs.0.count”:1,“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相结合,从而可以更改数组的大小。可以对同一文档执行多个更新,只要这些更新不冲突(因此“更新中存在冲突的MOD”错误) 因为“$push”:{“bugs”:[{“name”:“bug1”、“count”:1}]}和“$inc”:{“bugs.0.count”:1}都试图修改文档的相同部分(即“bugs”数组),所以它们发生冲突 如果每个更新影响文档的不同部分,则可以组合多个更新: 例如:
> 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),但是能够成功完成,因为每个操作都会影响文档的不同部分
我知道这并不完全是您希望做的,但希望它能让您更好地了解更新的工作原理,也许还能提供一些想法,让您了解如何重新构造更新和/或文档以执行应用程序所需的功能。祝您好运。显然,您不能有两个modi同一个字段的fiers。@SergioTulentsev:我认为它们是两个不同的字段:“bugs”和“bugs.0.count”?好吧,我不知道。MongoDB可能会这样想:)@SergioTulentsev:是的,我很有希望。非常感谢:-)谢谢Marc。奇怪的巧合是,当你键入这个问题的答案时,我正在阅读你的答案。不管怎样,这是否意味着基本上不支持对同一数组中的元素执行多个更新操作?如果是,可能需要支持关于它的任何计划在未来?谢谢。我尝试了使用$inc对同一数组部分进行多次修改,结果成功:db.test.update({“name”:“albert”},{“$inc”:{“bugs.0.count”:1},“$inc”:{“bugs.1.count”:1});我认为只有在同一数组中合并$push和其他操作时才会出现此问题?正如您所发现的,只要更新不冲突,一个数组中的多个元素可能会同时更新。冲突源于试图在修改数组的一个元素的同时更改数组的大小。另一方面,您可能会注意到更新“{“$inc”:{“bugs.0.count”:1},“$inc”:{“bugs.1.count”:1}”没有按预期工作(这是因为更新文档有一个重复的键“$inc”)。增加这两个字段的正确方法如下:>db.test.update({“name”:“albert”},{“$inc”:{“bugs.0.count”:1,“bugs.count”:1})哇,我不知道重复的钥匙“$inc”有问题。谢谢!
> 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." }
>