Запрос агрегата MongoDB для поиска объектов, содержащих хотя бы одно совпадение из другой коллекции - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь написать запрос для моей базы данных фильмов о монго, в которой есть две коллекции, фильм и рейтинги со следующей структурой: фильм

{
    "_id" : ObjectId("5bb3e0a9dac8ab419c430e94"),
    "MovieId" : 3,
    "MovieTitle" : "Four Rooms (1995)",
    // and other unrelated fields
}

рейтинги:

{
    "_id" : ObjectId("5bb3e049dac8ab419c4223ed"),
    "user_id" : 450,
    "item_id" : 172,
    "rating" : 4,
    "timestamp" : 882372103
}

где MovieId == item_id.Мне нужно найти топ-10 названий фильмов всех фильмов, по крайней мере, с одним рейтингом рецензии менее 3.

Вот моя попытка найти идентификатор топ-10 фильма, который работает:

db.ratings.aggregate(
  [
    {"$group":
      {
        _id: {item_id:"$item_id"},
        ratingAverage: {$avg: "$rating"}
      }
    } ,{$sort : { ratingAverage: -1 } }, {$limit : 10}
  ]
)

Вот моя попытка найти 10 лучших фильмов с рейтингом не ниже 3.

db.ratings.aggregate([
  {"$match":
    "rating":{"$lt":3}
  },
  {"$group":
    {
      _id: "$item_id",
      ratingAverage: {$avg: "$rating"}
    }
  },
  {$lookup:
  {
    "from": "movie",
    "localField": "_id",
    "foreignField": "MovieId",
    "as": "movie_details"
  }},{$sort : { ratingAverage: -1 } }, {$limit : 10}

])

Это возвращение:

ok" : 0,
    "errmsg" : "The field 'rating' must be an accumulator object",
    "code" : 40234,
    "codeName" : "Location40234"

Может кто-нибудь дать мне несколько советов покак это сделать

1 Ответ

0 голосов
/ 06 октября 2018

вы должны изменить свою $match часть следующим образом:

...
{"$match":
    { "rating":{"$lt":3} }
},
...

вы, вероятно, забыли поставить {} вокруг запроса для $match

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...