拥有非常简单的2个mongo文档:
{_id:1, v:1}
{_id:2, v:1}
现在,基于_id
数组,我需要增加字段v
多次_id出现。例如[1, 2, 1]
应生成
{_id:1, v:3} //increased 2 times
{_id:2, v:2} //increased 1 times
当然,简单更新可以消除$in
中的重复:
db.r.update({_id:{$in:[1,2,1]}}, {$inc:{v:1}}, {multi:true})
有没有办法在没有for循环的情况下做到这一点? /提前谢谢/
答案 0 :(得分:2)
没有办法在单个更新语句中执行此操作。
$ in运算符“删除副本”的原因很简单,因为1
已经匹配,再次匹配没有意义。因此,您无法使文档“匹配两次”。
批量更新操作也没有当前方式。但that feature即将来临。
您可以查看您的“批次”,并决定将要更新的同一文档的出现组合在一起,然后将您的增量发布到适当数量的单位。然而,就像循环数组项一样,操作会有点变形,虽然效率会更高一些。
答案 1 :(得分:2)
这是不可能直接的。您必须在您的客户端中执行此操作,您至少可以尝试最小化所需的批量更新次数。
首先,查找计数。这取决于您的编程语言,但您想要的是[1, 2, 1] => [ { 1 : 2 }, { 2 : 1} ]
(这些是各个ID的计数,即id 1
出现两次,等等。)像linq oder underscore.js这样的东西是在这里很有帮助。
接下来,由于您无法在单个操作中执行不同的更新,因此请按计数对它们进行分组,并更新所有对象,其计数必须在一个批处理中增加一个公共固定值:
伪代码:
var groups = data.groupBy(p => p.Value);
foreach(var group in groups)
db.update({"_id" : { $in : group.values.asArray }},
// increase by the number of times those ids were present
{$inc : { v : group.key } })
仅当有许多文档必须增加相同的值时,这比单个更新更好。