首页 > 解决方案 > 在多个字段上执行 mongodb $set 时,这些字段是否按顺序更新?

问题描述

我需要在 MongoDB 中进行一次原子更新,根据另一个字段中的现有值更新一个字段,然后更新第二个字段。这样做的目的是在添加新值时更新帖子的平均投票者得分,而不必存储每个投票并每次重新评估它们。

我找到了一个方程来做到这一点:

average = (size * average + value) / (size + 1);

然后我将其翻译成一个(有点难看,但希望是功能性的)MongoDB更新命令:

{ 
    $set: { 
        'average' : { 
            '$divide' : [ 
                { 
                    '$add' : [ 
                        { '$multiply' : [ 'size' , 'average' ] } , 
                        value 
                    ] 
                } , 
                { '$add' : [ 'size' , 1 ] } 
            ] 
        } , 
        'size' : { 
            '$add' : [ 'size' , 1 ] 
        } 
    } 
}

问题是我必须同时使用“大小”字段(投票数)来更新“平均”字段(平均投票数),然后还要增加“大小”字段本身。我想知道的是,我能否确定“size”字段会在“average”字段之后更新,还是 $set 命令以不可预知的顺序执行?

标签: mongodb

解决方案


推荐阅读