【问题标题】:MongoDB: upsert multiple fields based on multiple criteriaMongoDB:根据多个条件更新多个字段
【发布时间】:2013-03-19 09:26:25
【问题描述】:

我是 Mongo 的新手。我想根据多个标准自动更新文档。文档如下所示:

 {_id:..., hourOfTime:..., total:..., max:..., min:..., last:...}

这基本上是由_id 标识的项目的点击次数每小时汇总。每五秒钟将每个项目的点击从应用程序刷新到 MongoDB。因此,文档需要每五秒更新一次。

情况就是这样。假设在t=t0,我们有{_id:"nike", total:123, max:10, min:3, last:9},然后在t=t1,我收到消息{_id:"nike", count: 12}。现在,对于_id="nike",我需要执行以下操作,

  1. total 增加12
  2. 如果max < 12,更新max=12
  3. 如果min > 12,更新min=12
  4. 更新last=12

我希望所有这些操作都是原子的。我无法在一个查询中转换它。任何帮助/提示表示赞赏。

【问题讨论】:

    标签: mongodb atomic upsert


    【解决方案1】:

    这不能通过单个查询来完成。这是我的做法:

    1. 在文档上有一个名为locked 的字段。如果locked 字段为假,则运行findAndModify 以获取文档,并将锁定字段设置为锁定的Date()。这将阻止其他应用程序实例修改文档,前提是它们还检查 locked 字段。
    2. 修改文档应用端,然后原子更新,设置locked为false。 只要修改文档的任何内容在locked 字段上运行findAndModify,整个修改都应该是原子的。

    确保有一个锁定超时的阈值,这样如果机器发生故障,文档就不会被无限期锁定。这意味着当第二次更新文档(并释放锁)时,应用程序应该确保文档中的日期是它所期望的,以确保它仍然拥有锁。

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2017-10-23
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多