我需要在mongodb中查找电影名称及其平均评级吗?

时间:2018-09-30 09:20:28

标签: mongodb aggregation-framework

我有一个收藏电影名称,并且插入了一些具有流行电影数据的数据,例如发行日期,导演姓名和movieID。

我已将另一个表中的数据插入到显示用户提交评论的电影的同一movieId集合中。

现在的问题是,我必须找到每部电影的标题和平均评分。这里只有用户评论过的一部电影数据。

db.movies.insert([
  {
    Movie_ID: 1,
    MovieName: 2001,
    Director: "Stanley Kubrick",
    Leading_Actors: [
      "Daniel Richter",
      "Gary Lockwood",
      "Keir Dullea",
      "William Sylvester"
    ],
    Release_Date: 1968,
    Oscar_Won: 1,
    Country: "USA"
  }
]);

db.movies.insert([
  {
    Movie_ID: 1,
    ReviewedBy: "Joe",
    Date: "6/15/2018",
    Rating: 9,
    Comments: "The best ever!"
  },
  {
    Movie_ID: 1,
    ReviewedBy: "Howie",
    Date: "6/9/2018",
    Rating: 7
  }
]);

我尝试但失败了。我需要电影名称,我想它将通过电影ID获得,然后将avg()应用于收视率列。这是我的代码段:

db.movies.aggregate([{$group:{_id:"$Movie_ID",AvgRate:{$avg:"$Rating"}}}]);

但是我得到了movieId,因为我使用_id作为Movie_ID,但是我需要电影的名称。是的,我正在使用mongo db 4.1的命令行或shell版本

2 个答案:

答案 0 :(得分:1)

您可以尝试以下汇总

db.movies.aggregate([
  { "$group": {
    "_id": "$Movie_ID",
    "AvgRate": { "$avg": "$Rating" }
  }},
  { "$lookup": {
    "from": "movies",
    "let": { "movieId": "$_id" },
    "pipeline": [
      { "$match": {
        "$expr": { "$eq": [ "$Movie_ID", "$$movieId" ] },
        "MovieName": { "$exists": true }
      }}
    ],
    "as": "movie"
  }},
  { "$project": {
    "Movie_ID": "$_id",
    "AvgRate": 1,
    "MovieName": { "$arrayElemAt": ["$movie.MovieName", 0] }
  }}
])

答案 1 :(得分:1)

您可以使用以下汇总。

$match收集存在电影名称的所有文档,然后在电影ID上附加$lookup以获得评分。

$project保留名称,$avg获得电影平均评分。

db.movies.aggregate([
  {"$match":{"MovieName":{"$exists":true}}},
  {"$lookup":{
    "from":"movies",
    "localField":"Movie_ID",
    "foreignField":"Movie_ID",
    "as":"movie_rating"
  }},
  {"$project":{
    "_id":0,
    "MovieName":1,
    "AvgRate":{"$avg":"$movie_rating.Rating"}
  }}
])