Mongodb从带有Moviename的嵌套数组中获得平均评分

时间:2018-10-03 19:11:45

标签: arrays mongodb average

我是MongoDB的新手。我收藏了如图collection_image

所示的电影

某些电影具有MoveiReview,而某些电影具有MovieReview。我要列出的是电影的平均评分及其所有电影的名称。

{
    "_id" : ObjectId("5ba65d9cdfbc44415d0edaec"),
    "MovieName": "King Kong"
    "avgAge" : 9.0
}
{
    "_id" : ObjectId("5ba65d9cdfbc44415d0edaec"),
    "MovieName": "King Kong"
    "avgAge" : 9.0
}

我尝试了以下代码,但仅获得具有平均评分的ID。

db.movies.aggregate([

    { $unwind: "$MovieReview" },
    { $group : { _id: "$_id", avgRating : {  $avg : "$MovieReview.Rating" }}},

]);

结果

{
    "_id" : ObjectId("5ba65d9cdfbc44415d0edaec"),
    "avgRating" : 9.0
}

/* 2 */
{
    "_id" : ObjectId("5ba65d9cdfbc44415d0edaeb"),
    "avgRating" : 10.0
}

我认为解决方案很简单,但我无法弄清楚,或者我不知道要寻找什么。任何帮助,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

您的问题是您是否没有MovieName?如果是这样,您应该像这样修改代码

db.movies.aggregate([
  {
    $unwind: "$MovieReview" 
  },
  { 
    $group : { 
      _id: "$_id", 
      MovieName: { $first: "$MovieName" }, 
      avgRating : {  $avg : "$MovieReview.Rating" }
    }
  },

]);

答案 1 :(得分:0)

在这种情况下,按_id分组是没有意义的。如果您需要计算平均值的所有等级都包含在单个文档的MovieRating数组中,那么您需要这样做:

db.movies.aggregate({
    $addFields: {
        avgRating: { $avg: "$MovieReview.Rating" }
    }
})