Mongo - 从对象更新集合的每个文档
Posted
技术标签:
【中文标题】Mongo - 从对象更新集合的每个文档【英文标题】:Mongo - Update each documents of a collection from an Object 【发布时间】:2017-07-25 02:14:41 【问题描述】:在 Meteor 服务器端方法中,我注入了一个带有 key=_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);
);
【问题讨论】:
您基本上是在从globalPositions
复制到Tasks
。您的更新循环是正确的,并且没有大量方法可以执行此操作,因为每个文档都会收到唯一的值。您还必须考虑如果您的服务器在此批量更新过程中崩溃会发生什么,因为您不知道从哪里停下来。 globalPositions
是如何填充的?
@MichelFloyd globalPositions
一次性填充,来自特定客户端事件的新对象索引(网格中任务的重新排序)。然后通过方法调用将其发送到服务器。我完全不知道更新过程中服务器崩溃的问题:你能告诉我更多吗?
Mongo 可能不会在大更新中崩溃,但除非 gridIndex
在更新前为空,否则您将不知道哪些已经更新.实际上,bulk.execute 在您的上下文中可能很有用。这使您基本上可以将所有更新排队,然后批量执行。
【参考方案1】:
默认update
操作更新单个文档(适用于 Meteor 和 MongoDB)。要更新所有匹配的文档,您需要将参数multi
作为true
传递。
根据您的情况,更新看起来很简单,以下 sn-p 应该可以工作:
Tasks.update(, $set: gridIndex: x, multi: true)
说明:将查询选择器留空以匹配所有文档,然后通过set
运算符更新您希望的必填字段,最后将multi
传递为true
以确保所有匹配的文档都进行待更新。
【讨论】:
但是每个文档都必须用一个单独属于他的值(x,或y,或z...)进行更新。这就是为什么在对象中,文档的_id
是key
。在您的回复中,每个文档都会有gridIndex: x
no?
在MongoDB
中,每个文档都有不同的_id
。如果您尝试匹配_id: key
,它将只匹配一个文档。如果我错了,请纠正我。
正确。我的问题是只更新一个具有正确值的文档,并在每个文档上重复(循环)。请参阅我的问题的编辑。每个文档都必须拥有自己的权利gridIndex value
。是不是更清楚了?以上是关于Mongo - 从对象更新集合的每个文档的主要内容,如果未能解决你的问题,请参考以下文章