我有一个文档,其中有一个名为“评级”的字段。这是一个对象数组,每个对象都包含userId和ratingValue
ratings: Array
0: Object
userId: "uidsample1"
ratingValue: 5
1: Object
userId:"uidsample2"
ratingValue:1.5
我想做一个汇总管道,以在更新或添加数组中的一个评分时计算新的平均值。然后,我想将该值作为一个称为averageRating的新字段放入文档中。
我试过平仓,然后$ avg的$ add字段:“ ratings.ratingValue”,但它添加到平仓的文档中,但没有得到平均值。看起来像这样(自从在指南针上测试之后就不完全一样)
db.test.aggregate{
[
{
$unwind: {
path: "$ratings"
}
},
{
$addFields {
averageRating: {
$avg: "$ratings.ratingValue"
}
}
}
]
}
有什么好的查询结构?
你实际上并不需要$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 }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句