mongodb,在单次更新中多次增量

时间:2014-02-20 11:00:09

标签: mongodb

拥有非常简单的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循环的情况下做到这一点? /提前谢谢/

2 个答案:

答案 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 } }) 

仅当有许多文档必须增加相同的值时,这比单个更新更好。