繁体   English   中英

MongoDB平均嵌入数组作为额外字段

[英]MongoDB average of embedded Array as extra field

我的文档看起来像这样:

{
    "_id" : "53ce85eda2579da8b40c1f0f",
    "name" : "Autokino",
    "tags" : [
        "forMen"
    ],
    "ratings" : [
        { "rating" : 5, "uuid" : "..."},
        { "rating" : 4, "uuid" : "..."},
        { "rating" : 4, "uuid" : "..."},
        { "rating" : 1, "uuid" : "..."},
    ]
}

现在我需要ratings.rating的平均值(这里应该是3.5)。 我的查询如下所示:

activities.aggregate([
    { $match: { _id: ObjectID(req.params.id) } },
    { $unwind: '$ratings' },                                                                                                                                                                          
    { $group: {
        _id: '$_id',
        rating: { $avg: '$ratings.rating'},
    }},
]);

它有效,但我得到的是:

{
  "_id" : "53ce85eda2579da8b40c1f0f",
  "rating" : 3.5
}

这就是我需要得到的:

{
    "_id" : "53ce85eda2579da8b40c1f0f",
    "name" : "Autokino",
    "tags" : [
        "forMen"
    ],
    "rating" : 3.5
}

(原始文档没有评级数组,但评级平均)

我怎么解决这个问题?

$group$project这样的流水线阶段是“绝对的”,因为只发出声明的字段。 你需要另一个运营商。 $first会做:

activities.aggregate([
    { "$match": { "_id": ObjectID(req.params.id) } },
    { "$unwind": "$ratings" },                                                                                                                                                                          
    { "$group": {
        "_id": "$_id",
        "name": { "$first": "$name" },
        "tags": { "$first": "$tags" },
        "rating": { "$avg": "$ratings.rating" },
    }},
]);

由于$unwind使得数组内容中的许多文档无法规范化,因此您可以在此处使用$first来仅仅“首次”出现您未以其他方式聚合的附加字段。

如果你担心很多字段以这种方式声明MongoDB 2.6确实提供了$$ROOT变量。 我的使用和输出可能不是你真正想要的:

activities.aggregate([
    { "$match": { "_id": ObjectID(req.params.id) } },
    { "$project": {
        "_id": "$$ROOT",
        "ratings": 1
    }},
    { "$unwind": "$ratings" },                                                                                                                                                                          
    { "$group": {
        "_id": "$_id",
        "rating": { "$avg": "$ratings.rating" },
    }},
]);

这给你的东西:

{
    "_id" : {
        "_id": "53ce85eda2579da8b40c1f0f",
        "name" : "Autokino",
        "tags" : [
            "forMen"
        ],
        "ratings" : [
            { "rating" : 5, "uuid" : "..."},
            { "rating" : 4, "uuid" : "..."},
            { "rating" : 4, "uuid" : "..."},
            { "rating" : 1, "uuid" : "..."},
        ]
    },
    "rating": 3.5
}

这是可以的,因为_id的分组与整个文档的分组相同。 因此,您始终可以添加最终$project以返回类似状态。 但这里没有通配符。

我刚刚完成了整首歌曲和舞蹈,最后不得不重新添加我的所有领域。 不太理想!

所以我发现了这个 - 更容易:我有一个评论数组字段,其评级属性为1 - 5

{
      $addFields: { avg: { $avg: '$reviews.rating'}}
},

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM