在MongoDB中,计算数组中评分的平均值,然后将该字段添加到原始文档中。

3

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

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

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

我尝试了展开操作,然后使用$avg:"ratings.ratingValue"的$add field,但它会添加到展开的文档中,而且无法得到平均值。它看起来像这样(不完全是因为在Compass上测试)

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

      }
    ]
  }

这个问题的查询结构应该如何设计?
2个回答

1
使用以下方式在 $unwind 后使用 $group 计算 averageRating。聚合是一种读取操作。之后需要更新文档。
[
    {
        '$unwind': {
            'path': '$ratings'
        }
    }, {
        '$group': {
            '_id': '$_id', 
            'averageRating': {
                '$avg': '$ratings.ratingValue'
            }
        }
    }
]

1
你实际上不需要使用$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 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接