gpt4 book ai didi

mongodb - 计算嵌入文档/数组中字段的平均值

转载 作者:IT老高 更新时间:2023-10-28 13:24:13 26 4
gpt4 key购买 nike

我想用数组 rating 中的 rating 字段来计算这个对象的 rating_average 字段。您能帮我了解如何使用 $avg 进行聚合吗?

{
"title": "The Hobbit",
"rating_average": "???",
"ratings": [
{
"title": "best book ever",
"rating": 5
},
{
"title": "good book",
"rating": 3.5
}
]
}

最佳答案

aggregation framework在 MongoDB 3.4 和更新版本中提供 $reduce 运算符,无需额外管道即可有效计算总数。考虑将其用作表达式以返回总评分并使用 $size 获得评分数。与 $addFields ,因此可以使用算术运算符 $divide 计算平均值 如公式中的 average = 总评分/评分数:

db.collection.aggregate([
{
"$addFields": {
"rating_average": {
"$divide": [
{ // expression returns total
"$reduce": {
"input": "$ratings",
"initialValue": 0,
"in": { "$add": ["$$value", "$$this.rating"] }
}
},
{ // expression returns ratings count
"$cond": [
{ "$ne": [ { "$size": "$ratings" }, 0 ] },
{ "$size": "$ratings" },
1
]
}
]
}
}
}
])

样本输出

{
"_id" : ObjectId("58ab48556da32ab5198623f4"),
"title" : "The Hobbit",
"ratings" : [
{
"title" : "best book ever",
"rating" : 5.0
},
{
"title" : "good book",
"rating" : 3.5
}
],
"rating_average" : 4.25
}

对于旧版本,您需要先应用 $unwind ratings 数组字段上的运算符首先作为初始聚合管道步骤。这将从输入文档中解构 ratings 数组字段以输出每个元素的文档。每个输出文档都将数组替换为一个元素值。

第二个流水线阶段是 $group运算符按 _idtitle 键标识符表达式对输入文档进行分组并应用所需的 $avg计算平均值的每个组的累加器表达式。还有一个累加器运算符 $push它通过返回将表达式应用于上述组中的每个文档而产生的所有值的数组来保留原始评级数组字段。

最后的流水线步骤是 $project运算符然后 reshape 流中的每个文档,例如通过添加新字段 ratings_average

因此,例如,如果您的收藏中有一个示例文档(如上等):

db.collection.insert({
"title": "The Hobbit",

"ratings": [
{
"title": "best book ever",
"rating": 5
},
{
"title": "good book",
"rating": 3.5
}
]
})

要计算评级数组的平均值并将值投影到另一个字段 ratings_average,您可以应用以下聚合管道:

db.collection.aggregate([
{
"$unwind": "$ratings"
},
{
"$group": {
"_id": {
"_id": "$_id",
"title": "$title"
},
"ratings":{
"$push": "$ratings"
},
"ratings_average": {
"$avg": "$ratings.rating"
}
}
},
{
"$project": {
"_id": 0,
"title": "$_id.title",
"ratings_average": 1,
"ratings": 1
}
}
])

结果:

/* 1 */
{
"result" : [
{
"ratings" : [
{
"title" : "best book ever",
"rating" : 5
},
{
"title" : "good book",
"rating" : 3.5
}
],
"ratings_average" : 4.25,
"title" : "The Hobbit"
}
],
"ok" : 1
}

关于mongodb - 计算嵌入文档/数组中字段的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com