0

我是 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

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

4

1 回答 1

1

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

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

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

于 2013-03-25T17:18:42.977 回答