我能把$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}]}});
但当我try 这样组合时:
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日更新
我在一个数组的不同元素上try 了多个$inc,它可以工作(虽然不正确.下面的答案中引用了这一点,以澄清为什么不工作,以及什么可以工作: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结合起来,可以改变数组的大小.