Mongodb更新数量有限的文件

时间:2013-04-26 12:56:57

标签: mongodb

我有一个包含1亿份文件的藏品。我想安全地更新一些文件(安全地我的意思是仅在文档尚未更新时更新文档)。在Mongo中有一种有效的方法吗?

我打算使用带有限制条款的$ isolated运算符,但看起来mongo不支持限制更新。

这看起来很简单,但我被卡住了。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

Per Sammaye,看起来没有“适当”的方式来做到这一点。 我的解决方法是创建一个sequence as outlined on the mongo site,只需在我的集合中的每条记录中添加一个'seq'字段。现在我有一个可以可靠排序的唯一字段来更新。

可靠的可分类在这里很重要。我只是对自动生成的_id进行排序,但我很快意识到自然顺序与ObjectId的升序不同(来自this page它看起来像字符串值优先于匹配的对象值我在测试中观察到的行为)。此外,完全有可能将记录重新定位到磁盘上,这使得自然顺序不可靠进行排序。

所以现在我可以查询具有最小'seq'的记录,该记录尚未更新以获得包含起点。接下来,我查询'seq'大于我的起点并跳过的记录(重要的是跳过,因为如果你删除文件等'seq'可能很稀疏......等等)我想要更新的记录数。在该查询上设置限制为1,并且您有一个非包含端点。现在,我可以使用'updated'= 0,'seq'> =我的起点和<的查询发出更新。我的终点。假设没有其他线程可以击败我,更新应该给我我想要的东西。

以下是步骤:

  1. 使用findAndModify
  2. 创建自动增量序列
  3. 在您的集合中添加一个使用自动增量序列的字段
  4. 查询以找到合适的起点:db.xx.find({updated:0})。sort({seq:1})。limit(1)
  5. 查询以查找合适的端点:db.xx.find({seq:{$ gt:startSeq}})。sort({seq:1})。skip(updateCount).limit(1)
  6. 使用起点和终点更新集合:db.xx.update({updated:0,seq:{$ gte:startSeq},seq:{$ lt:endSeq},$ isolated:1},{updated :1},{multi:true})
  7. 非常痛苦,但它完成了工作。