【发布时间】:2012-04-07 01:33:42
【问题描述】:
我可以在一个语句中结合 $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,它可以工作(虽然不正确。从下面的答案中引用以阐明为什么这不起作用以及什么有效: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 结合使用是问题。
【问题讨论】:
-
显然,同一个字段不能有两个修饰符。
-
@SergioTulentsev:我认为它们是 2 个不同的字段:“bugs”和“bugs.0.count”?
-
好吧,我不知道。 MongoDB 可能会不这么认为:)
-
@SergioTulentsev:是的,我充满希望。非常感谢:-)
标签: mongodb