Mongodb 流星光标是否从后台更改更新到数据库?

Mongodb 流星光标是否从后台更改更新到数据库?,mongodb,meteor,cursor,Mongodb,Meteor,Cursor,我目前正在使用Meteor 1.4.1和Mongo v3.2 我每晚在Meteor服务器端执行一些后台任务(通过调用方法),主要是更新记录。这可能涉及超过100万条记录,需要几个小时才能完成 目前,我在数据记录上有一个标志,当更新完成时,该标志被设置为true。我的代码如下所示: collection: {completed: boolean, [various other fields]} var cursor = Collection.find({completed: false}); c

我目前正在使用Meteor 1.4.1和Mongo v3.2

我每晚在Meteor服务器端执行一些后台任务(通过调用方法),主要是更新记录。这可能涉及超过100万条记录,需要几个小时才能完成

目前,我在数据记录上有一个标志,当更新完成时,该标志被设置为true。我的代码如下所示:

collection: {completed: boolean, [various other fields]}

var cursor = Collection.find({completed: false});
cursor.forEach(function(record) {
   [some work]
   Collection.update({_id: record._id},{$set: {completed: true}});
});
我的问题是:

  • 如果我在两台机器上运行此任务,游标会更新吗 这样两台机器就不会互相碰撞了 在同一张唱片上工作
  • 如果记录被一台机器标记为已完成,更改是否会被取消 传播到另一台计算机的游标,以便记录 从它的集合中移除
  • 假设两台机器的速度大致相同,有多高 他们有可能在同一时间获得相同的记录 时间(即第二台机器将在同一记录上开始工作 在第一台机器完成其任务并将记录标记为 完成了吗
  • 底线,这是否会引入太多不可靠的比赛条件
目前,我的数据库服务器没有满负荷运行,所以理想情况下,我希望在夜间启动一些额外的机器,并在所有机器上运行作业,以更快地完成任务


我的另一个选择是使用一个额外的查询项(可能会将一个额外的项传递给该方法),并使用它将记录集本质上划分为每台机器的一个片段,这样它们就不会拾取相同的记录。但理想情况下,如果可能的话,我希望避免这种情况。

为什么不在更新中使用
{multi:true}
选项,并完全避免
forEach()
循环?问题是[some work]部分:-)该部分需要记录中的数据。基本上,我需要检索每个记录,使用各种字段执行一些计算,并在另一个集合中创建其他记录。然后,当我完成该操作后,我可以将该记录更新为“completed:true”,并移动到下一条记录。如果所有的工作都只是更新原始文档,那么我可能会找到一种方法将其全部重构为一条update语句。但我会处理每个文档,以在不同的集合中创建新文档。这些文档可能有您想要的答案。写锁保证原子更新。此外,“
db.collection.find()
将只返回匹配的文档,
db.collection.update()
将只写入匹配的文档。我认为这意味着您可以并行更新操作,而无需执行非自然操作。