我能否将 $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,但我不确定是否支持?
更新于2012年3月23日
我尝试在数组的不同元素上多次使用$inc,并且它可以工作(尽管不正确。引用下面的答案以澄清为什么这不起作用以及什么起作用:正确增加两个字段的方法如下:> 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组合使用可能会改变数组是问题的根源。