MongoDB:根据多个条件插入多个字段

时间:2013-03-19 09:26:26

标签: mongodb atomic upsert

我是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
  2. 增加12
  3. 如果max < 12,请更新max=12
  4. 如果min > 12,请更新min=12
  5. 更新last=12
  6. 我希望所有这些操作都是原子的。我无法在一个查询中转换它。任何帮助/提示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

单个查询无法完成此操作。我将如何做到这一点:

  1. 在名为locked的文档上有一个字段。如果findAndModify字段为false,则运行locked以获取文档,并将锁定字段设置为锁定的Date()。这将阻止其他应用程序实例修改文档,前提是它们还会检查locked字段。
  2. 修改文档应用程序端,然后以原子方式更新它,将locked设置为false。 只要修改文档的任何内容在findAndModify字段上运行locked,整个修改就应该是原子的。
  3. 确保锁定超时的阈值,以便在机器爆炸时文档不会无限期锁定。这意味着当第二次更新文档(并释放锁定)时,应用程序应确保文档中的日期符合预期,以确保它仍然具有锁定。