【问题标题】:Calculate average of ratings in array, then add field to original document in MongoDB计算数组中评分的平均值,然后将字段添加到 MongoDB 中的原始文档
【发布时间】:2019-06-13 16:53:04
【问题描述】:

我有一个文档,其中包含一个名为 rating 的字段。这是一个对象数组,每个对象包含 userId 和 ratingValue

ratings: Array
 0: Object
  userId: "uidsample1"
  ratingValue: 5
 1: Object
  userId:"uidsample2"
  ratingValue:1.5

我想做一个聚合管道来计算当数组中的一个评级被更新或添加时的新平均值。然后,我想将该值作为一个名为 averageRating 的新字段放入文档中。

我已经尝试展开,然后 $add field of $avg : "ratings.ratingValue" 但它添加到展开的文档中并且没有得到平均值。它看起来像这样(不完全是因为在指南针上测试)

db.test.aggregate{
  [
    {
    $unwind: {
    path: "$ratings"
    }
  },
  { 
    $addFields {
    averageRating: {
    $avg: "$ratings.ratingValue"
      }
    }

      }
    ]
  }

对此有什么好的查询结构?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    $unwind 之后使用$group 计算averageRating。聚合是一个读操作。之后您需要更新文档。

    [
        {
            '$unwind': {
                'path': '$ratings'
            }
        }, {
            '$group': {
                '_id': '$_id', 
                'averageRating': {
                    '$avg': '$ratings.ratingValue'
                }
            }
        }
    ]
    

    【讨论】:

      【解决方案2】:

      您实际上不需要$unwind$group 来计算平均值,这些操作成本很高

      您可以简单地使用$addFields$avg

      db.col.aggregate([
          {$addFields : {averageRating : {$avg : "$ratings.ratingValue"}}}
      ])
      

      样本收集和聚合

      > db.t62.drop()
      true
      
      > db.t62.insert({data : {ratings : [{val : 1}, {val : 2}]}})
      WriteResult({ "nInserted" : 1 })
      
      > db.t62.find()
      { "_id" : ObjectId("5c44d9719d56bf65be5ab2e6"), "data" : { "ratings" : [ { "val" : 1 }, { "val" : 2 } ] } }
      
      > db.t62.aggregate([{$addFields : {avg : {$avg : "$data.ratings.val"}}}])
      { "_id" : ObjectId("5c44d9719d56bf65be5ab2e6"), "data" : { "ratings" : [ { "val" : 1 }, { "val" : 2 } ] }, "avg" : 1.5 }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 2021-05-30
        • 2016-10-16
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        相关资源
        最近更新 更多