我有一个收藏电影名称,并且插入了一些具有流行电影数据的数据,例如发行日期,导演姓名和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版本
答案 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"}
}}
])