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

4

我有一个叫做“电影”的集合,我插入了一些流行电影的数据,例如发布日期、导演姓名和电影ID。

我将另一个表格中的数据插入到同一个“电影”集合中,其中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版本。


这两个集合都是“电影”集合吗?因为一个集合包含“电影名称”,另一个包含“评分”...它们是相同的吗? - Ashh
我必须将数据插入到一个名为“电影”的单个集合中。 - Vikram
添加 RatingsComments 字段?集合名称是什么?你想要更新还是聚合? - Ashh
聚合是因为我需要找到用户对特定电影给出的“评分”的平均值。 - Vikram
在这个演示中,有两个用户对电影ID“1”即“2001”进行了评分,我需要找到平均值。 - Vikram
显示剩余2条评论
2个回答

2
您可以尝试以下聚合:
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] }
  }}
])

谢谢您的回答!它帮助我填充管道。 - Efrain Sanjay Adhikary

1
你可以使用以下聚合操作。

$match 收集所有电影名称存在的文档,然后使用 $lookup 在电影 ID 上获取评分。

$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"}
  }}
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接