【问题标题】:Mongodb get average rating from nested array with moviename [duplicate]Mongodb从带有moviename的嵌套数组中获得平均评分[重复]
【发布时间】:2019-03-09 02:29:07
【问题描述】:

我是 MongoDB 的新手。我有一系列电影,如图

有些电影有 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
}

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

【问题讨论】:

  • $first 聚合使用MovieName... 像MovieName: { '$first': '$MovieName' }
  • 谢谢,知道了。如果我想要平均评分为 0 且没有评论的电影怎么办

标签: arrays mongodb average


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    ]);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2017-04-16
      • 2017-12-11
      • 2016-07-08
      • 2017-07-20
      相关资源
      最近更新 更多