在mongodb文档中更新和查询评级

在mongodb文档中更新和查询评级,mongodb,Mongodb,我有mongodb集合用户。 每个用户都有一个名为rating的字段,该字段介于1和5之间。这意味着当用户投票给另一个用户时,他“给”了他1到5之间的投票。我在mongo文档中存储此数据时遇到问题,因为我必须通过评级字段查询用户集合,并且必须对其进行原子更新 如果我在可以使用$inc操作符更新投票数时同时存储评分和投票数,但我无法自动设置评分=((评分*投票)+投票值)/(投票+1) 我可以在文档中保留投票总数和投票数,并使用$inc更新,但我不能像那样查询投票总数/投票数>3 这个问题有什么解

我有mongodb集合
用户
。 每个用户都有一个名为
rating
的字段,该字段介于1和5之间。这意味着当用户投票给另一个用户时,他“给”了他1到5之间的投票。我在mongo文档中存储此数据时遇到问题,因为我必须通过
评级
字段查询用户集合,并且必须对其进行原子更新

  • 如果我在可以使用
    $inc
    操作符更新
    投票数时同时存储评分和投票数,但我无法自动设置
    评分=((评分*投票)+投票值)/(投票+1)

  • 我可以在文档中保留投票总数和投票数,并使用
    $inc
    更新,但我不能像
    那样查询投票总数/投票数>3


  • 这个问题有什么解决方案吗?

    您可以使用上面的选项2,然后将其与缓存的结果字段相结合。您可以通过在更新中使用过滤器谓词来设置数据流,使结果字段与文档的其余部分保持一致

    第一步是向模式中添加一个新字段,该字段将作为缓存的评级字段。这将允许您执行范围查询,而无需进行动态分割。您将遇到的问题是,您不能以原子方式递增vows\u sum&vows\u num字段,并且在同一个原子操作中设置缓存的评级字段。这就是你要做的

    1) 以原子方式递增投票总数和投票数字段
    2) 获取更新文档的\u id、投票数\u总和和投票数
    3) 更新评级,但作为筛选谓词的一部分,包括_id、预期投票数_sum和预期投票数_num字段

    db.collection.update({_id: $id, votes_sum: $votes_sum, votes_num: $votes_num}, {$set: {rating: $votes_sum / $votes_num}});
    
    这将确保自您更新文档后没有任何更改。如果在更新这些字段和生成评级之间有其他人出现并更新了这些字段,那么该文档将不会在update语句的find部分中返回,因此不会使用过时数据进行更新

    这种模式利用了这样一个事实,即在MongoDB中,写入在文档级别是原子的,因此您不必担心文档中数据的一致性。好在评级设置正确,因为每次更新投票总数和投票数字段的操作后都会更新评级

    有关一些示例代码,请参见此处: