【问题标题】:Mongodb update limited number of documentsmongodb更新文件数量有限
【发布时间】:2013-04-26 12:56:56
【问题描述】:

我有一个包含 1 亿个文档的集合。我想安全地更新一些文档(安全地我的意思是仅在文档尚未更新时才更新它)。在 Mongo 中是否有有效的方法?

我打算使用带有限制子句的 $isolated 运算符,但似乎 mongo 不支持限制更新。

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

【问题讨论】:

  • 嗯,除了给你一个 JIRA 链接之外,我不能再劝你了:jira.mongodb.org/browse/SERVER-1599
  • 谢谢。我注册只是为了投票支持这个问题 :-) 现在找到一些复杂的解决方法,直到实现该功能......
  • "safely" - 我不清楚为什么限制与此有关 - 如果您计划更新所有文档并使用“{multi:true}”,那么每个文档将只更新一次.你能解释一下你的确切用例吗?我怀疑可能有解决方法。
  • 我不会更新所有文档——这将是未知数量的文档(例如,可能是前 100 个文档,也可能是前 1000 个)。

标签: mongodb


【解决方案1】:

根据 Sammaye,看起来没有“正确”的方法可以做到这一点。 我的解决方法是创建一个sequence as outlined on the mongo site,然后在我的集合中的每条记录中简单地添加一个“seq”字段。现在我有一个唯一的字段,可以可靠地对其进行排序以进行更新。

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

所以现在我可以查询具有最小“seq”的记录,该记录尚未更新以获得包容性起点。接下来我查询'seq'大于我的起点的记录并跳过(重要的是跳过,因为如果你删除文档等,'seq'可能是稀疏的......)我想要更新的记录数。将该查询限制为 1,您将获得一个非包含端点。现在我可以使用“updated”=0、“seq”>=我的起点和

下面是步骤:

  1. 使用 findAndModify 创建自动递增序列
  2. 向您的集合添加一个使用自动递增序列的字段
  3. 查询找到合适的起点:db.xx.find({ updated: 0 }).sort({ seq: 1 }).limit(1)
  4. 查询找到合适的端点:db.xx.find({ seq: { $gt: startSeq }}).sort({ seq: 1 }).skip(updateCount).limit(1)
  5. 使用起点和终点更新集合:db.xx.update({ updated: 0, seq: { $gte: startSeq }, seq: { $lt: endSeq }, $isolated: 1}, { updated : 1 },{ multi: true })

相当痛苦,但它可以完成工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多