在MongoDB中维护最大/最小统计数据级联集的最佳方法

在MongoDB中维护最大/最小统计数据级联集的最佳方法,mongodb,Mongodb,我们有一个系统,在该系统中,我们希望维护分为单独通道的大量日志信息的统计数据,每个通道都有一个概览文档,以级联方式维护统计数据,包括小时、天、月和年的最大值和最小值 我们可以维护一个文档来保存一个频道的统计数据一个月,每个月有一个最大值/分钟,每天有31个最大值/分钟,每天有24个小时的最大值/分钟 使用$inc计算文档对于就地原子更新非常有用,更新修改器上的$max和$min可以解决我们的问题,但不幸的是,这不可用 我们可以将最大值和最小值保留在任务处理器中,并发布$set,但这在协调系统中所

我们有一个系统,在该系统中,我们希望维护分为单独通道的大量日志信息的统计数据,每个通道都有一个概览文档,以级联方式维护统计数据,包括小时、天、月和年的最大值和最小值

我们可以维护一个文档来保存一个频道的统计数据一个月,每个月有一个最大值/分钟,每天有31个最大值/分钟,每天有24个小时的最大值/分钟

使用$inc计算文档对于就地原子更新非常有用,更新修改器上的$max和$min可以解决我们的问题,但不幸的是,这不可用

我们可以将最大值和最小值保留在任务处理器中,并发布$set,但这在协调系统中所有任务处理器(可能在不同的机器上)时存在问题,因此我们决定将mongo作为主要参考。同样的统计数据也可能由两个独立的任务在不同的任务处理器实例上同时运行而更新

因此,我们正在寻找关于最佳解决方案的意见/建议(我们不一定保留原始数据,因此不能进行后期处理)

  • 每次需要更新时读取、更新和保存

  • 使用db Eval执行JavaScript服务器端,通过只传入一个值来更新max/man级联

  • 还有别的办法吗


  • 非常感谢您的帮助。

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

    {_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确定更新是否失败,然后从第一步开始重试

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

    有关乐观锁定的其他资源可在此处找到: http://code.google.com/p/morphia/wiki/MongoNewsletterArticleDec2010


    MongoDB关于并发性的文档:

    谢谢Jenna,这正是我现在提出的解决方案,很高兴验证了它!我在这里看到了一个单一最大值的解决方案,但因为我有多个字段可能要使用FindModify的版本或修订号进行更新,所以非常感谢。