Мне нужно найти название фильма и их средний рейтинг в mongodb? - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть название коллекции фильмов, и я вставил данные, содержащие некоторые популярные данные фильмов, такие как дата выпуска, имя режиссера и 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
  }
]);

Iпопробовал, но не получилось. Мне нужно название фильма, которое, я думаю, будет получено по идентификатору фильма, а затем к столбцу оценок будет применена avg ().Вот фрагмент моего кода:

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

Но я получил movieId, потому что я использовал _id в качестве Movie_ID, но мне нужны названия фильмов.И да, я использую версию командной строки или оболочки mongo db 4.1

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вы можете использовать агрегацию ниже.

$match, чтобы собрать все документы, в которых присутствует название фильма, а затем $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"}
  }}
])
0 голосов
/ 30 сентября 2018

Вы можете попробовать ниже агрегации

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] }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...