在MongoDB中维护级联的Max / Min统计数据的最佳方法

时间:2012-07-04 11:37:40

标签: mongodb

我们有一个系统,我们希望将大量已记录信息的统计数据分成不同的渠道,每个渠道都有一个概览文档,其中包含统计数据,包括小时,天,月和年的最大值和最小值。级联时尚。

我们可以保留一个单独的文件来保存一个月的频道统计数据,其中每个月最大/最小,31每日最大/分钟,每天每小时最多24小时。

使用$ inc对文档进行计数非常适合原位更新,更新修饰符上的$ max和$ min将解决我们的问题,但遗憾的是无法使用。

我们可以在任务处理器中保持最大值和最小值并发出$ set但是这会在系统中的所有任务处理器(可能在不同的机器上)上协调这些问题,因此我们决定将mongo保留为主要参考。另外,在不同的任务处理器实例上同时运行两个单独的任务可能会更新相同的统计信息。

所以我们正在寻找关于最佳解决方案的评论/建议(我们不一定会保留原始数据,因此不能选择后处理)

  1. 阅读,更新&每次我们需要更新保存?

  2. 使用db Eval执行JavaScript服务器端以通过仅传入一个值来更新max / man级联?

  3. 还有其他办法吗?

  4. 非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找乐观的锁定。您可以通过在文档中存储版本字段来确保更新是原子的。请考虑以下示例:

{_id: xyz, version: 2, max: 10}

首先找到文件:

db.example.find({_id:xyz})

存储版本号并确定(客户端)是否需要更新最大值。如果是的话,

db.example.update({id:xyz, version: 2}, {$set: {max: 12}, $inc: {version: 1}})

如果版本在查询和更新发生的时间之间发生了更改,则此更新将失败,从而防止与并发相关的数据损坏。您可以使用getLastError来确定更新是否失败,然后从第1步重试。

您应该避免使用db.eval(),因为此操作需要全局锁定。

可以在此处找到有关乐观锁定的其他资源: http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22UpdateifCurrent%22 http://code.google.com/p/morphia/wiki/MongoNewsletterArticleDec2010

有关并发性的MongoDB文档:http://www.mongodb.org/display/DOCS/How+does+concurrency+work