Mongodb Mongo-从对象更新集合的每个文档

Mongodb Mongo-从对象更新集合的每个文档,mongodb,meteor,Mongodb,Meteor,在Meteor服务器端方法中,我使用key=\u id&value=number注入一个globalPositions对象,以更新Tasks集合的所有文档 globalPositions // {id1: x, id2: y, id3: z…} 如何在集合的每个文档上一次性进行如下更新 Tasks.update({_id: id1}, {$set: {gridIndex: x}}); 编辑 我找到了一个方法,但是他的速度和创造力呢?这些物体可能相当大 Object.keys(globalPo

在Meteor服务器端方法中,我使用
key=\u id
&
value=number
注入一个
globalPositions
对象,以更新
Tasks
集合的所有文档

globalPositions // {id1: x, id2: y, id3: z…}
如何在集合的每个文档上一次性进行如下更新

Tasks.update({_id: id1}, {$set: {gridIndex: x}});
编辑

我找到了一个方法,但是他的速度和创造力呢?这些物体可能相当大

Object.keys(globalPositions).map(function(key, index) {
    var value = globalPositions[key];
    Tasks.update({_id: key}, {$set: {gridIndex: value}});
});

默认情况下,
update
操作更新单个文档(适用于Meteor和MongoDB)。要更新所有匹配的文档,需要将参数
multi
传递为
true

根据您的情况,更新看起来非常简单,以下代码段应该可以工作:

Tasks.update({}, {$set: {gridIndex: x}}, {multi: true})

解释:将查询选择器留空以匹配所有文档,然后通过
set
操作符更新所需字段,最后将
multi
传递为
true
,以确保所有匹配的文档都将被更新。

但每个文档都必须使用一个值(x、y或z…)进行更新他只属于他一个人。这就是为什么在对象中,文档的
\u id
键的原因。在您的回复中,每个文档在
MongoDB
中都有
gridIndex:x
no?,每个文档都有不同的
\u id
。如果您尝试匹配
\u id:key
,它将只匹配一个文档。如果我错了,请纠正我。我的问题是只更新一个具有正确值的文档,并在每个文档上重复(循环)。查看我的问题的编辑。每个文档都必须有自己的权限
gridIndex值
。更清楚吗?你基本上是在从
globalPositions
复制到
Tasks
。您的更新循环是正确的,并且没有批量方式来完成此操作,因为每个文档都将收到一个唯一的值。你还必须考虑如果你的服务器在这个大批量更新的中间崩溃了会发生什么,因为你不知道你在哪里离开。
globalPositions
是如何填充的?@MichelFloyd
globalPositions
通过特定客户端事件上的新对象索引(网格中任务的重新排序)一次性填充的。然后通过方法调用将其发送到服务器。在更新的过程中,我完全不知道服务器崩溃的问题:你能告诉我更多吗?Mongo可能不会在大更新的中间崩溃,除非在更新之前<代码> GRIDEngult<代码>为空,否则你就不知道哪些已经被更新了。实际上,在您的上下文中可能会有用。这允许您将所有更新排队,然后批量执行它们。