mongodb,一次更新多次递增

mongodb,一次更新多次递增,mongodb,Mongodb,具有非常简单的2个mongo文档: {_id:1, v:1} {_id:2, v:1} 现在,基于\u id的数组,我需要将字段v的显示次数增加一倍。例如,[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}) 有没有一种不用

具有非常简单的2个mongo文档:

{_id:1, v:1}
{_id:2, v:1}   
现在,基于
\u id
的数组,我需要将字段
v
的显示次数增加一倍。例如,
[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循环的方法/提前谢谢你/

不,没有一种方法可以在一个更新语句中实现这一点

$in运算符“删除重复项”的原因很简单,因为th
1
已经匹配,没有再次匹配的意义。因此,您不能使文档“匹配两次”

此外,当前没有批处理更新操作的方法。但这一天就要到来了


您可以查看您的“批次”,并决定将要更新的同一文档的事件组合在一起,然后将增量发布到适当的单位数。但是,就像循环数组项一样,该操作将是程序化的,尽管效率稍高。

不,没有一种方法可以在单个update语句中实现这一点

$in运算符“删除重复项”的原因很简单,因为th
1
已经匹配,没有再次匹配的意义。因此,您不能使文档“匹配两次”

此外,当前没有批处理更新操作的方法。但这一天就要到来了


您可以查看您的“批次”,并决定将要更新的同一文档的事件组合在一起,然后将增量发布到适当的单位数。然而,就像循环数组项一样,操作将是程序化的,尽管效率稍高。

这是不可能直接实现的。你必须在你的客户机上这样做,在那里你至少可以尽量减少批量更新的次数

首先,找到计数。这取决于您的编程语言,但您需要的是类似于
[1,2,1]=>[{1:2},{2:1}]
(这些是各自id的计数,即id
1
出现两次,等等)类似于linq ORDER SURRONE.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 } }) 

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

这是不可能直接实现的。你必须在你的客户机上这样做,在那里你至少可以尽量减少批量更新的次数

首先,找到计数。这取决于您的编程语言,但您需要的是类似于
[1,2,1]=>[{1:2},{2:1}]
(这些是各自id的计数,即id
1
出现两次,等等)类似于linq ORDER SURRONE.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 } }) 

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

并且我所描述的有伪代码。干得好。为我辩护,我在阅读你的答案之前就开始编写代码了。但无论如何,我们的想法有点相似+先生,我敬你一杯,没有冒犯你的意思。这个答案是“你应该做什么”的一个例子,它本身就值得称赞+1回到你身上。我描述的是伪代码。干得好。为我辩护,我在阅读你的答案之前就开始编写代码了。但无论如何,我们的想法有点相似+先生,我敬你一杯,没有冒犯你的意思。这个答案是“你应该做什么”的一个例子,它本身就值得称赞+我希望有一种方法可以把答案合并起来,这样我们都可以获得学分:)我希望有一种方法可以把答案合并起来,这样我们都可以获得学分:)