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

Posted

技术标签:

【中文标题】Mongo - 从对象更新集合的每个文档【英文标题】:Mongo - Update each documents of a collection from an Object 【发布时间】:2017-07-25 02:14:41 【问题描述】:

在 Meteor 服务器端方法中,我注入了一个带有 key=_idvalue=numberglobalPositions 对象,以更新 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...)进行更新。这就是为什么在对象中,文档的_idkey。在您的回复中,每个文档都会有gridIndex: x no? MongoDB 中,每个文档都有不同的_id。如果您尝试匹配_id: key,它将只匹配一个文档。如果我错了,请纠正我。 正确。我的问题是只更新一个具有正确值的文档,并在每个文档上重复(循环)。请参阅我的问题的编辑。每个文档都必须拥有自己的权利gridIndex value。是不是更清楚了?

以上是关于Mongo - 从对象更新集合的每个文档的主要内容,如果未能解决你的问题,请参考以下文章

确定传入的 CSV 数据和现有的大型数据集 Mongo 集合之间的差异

Mongo 文档中的更新数组不起作用

Mongo 计数所有集合文档中出现的数组项

在 Mongo 集合中更新数组中的一条记录

更新/插入子文档时的 mongodb 性能

从 Mongo DB 文档的数组中的对象数组中删除一个值