mongodb,一次更新多次递增
具有非常简单的2个mongo文档: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}) 有没有一种不用
{_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的计数,即id1
出现两次,等等)类似于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的计数,即id1
出现两次,等等)类似于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回到你身上。我描述的是伪代码。干得好。为我辩护,我在阅读你的答案之前就开始编写代码了。但无论如何,我们的想法有点相似+先生,我敬你一杯,没有冒犯你的意思。这个答案是“你应该做什么”的一个例子,它本身就值得称赞+我希望有一种方法可以把答案合并起来,这样我们都可以获得学分:)我希望有一种方法可以把答案合并起来,这样我们都可以获得学分:)