【问题标题】:Mongo - Update each documents of a collection from an ObjectMongo - 从对象更新集合的每个文档
【发布时间】: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 在您的上下文中可能很有用。这使您基本上可以将所有更新排队,然后批量执行。

标签: mongodb meteor


【解决方案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。是不是更清楚了?
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2021-04-23
  • 2021-09-04
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多