#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
Я новичок в MongoDB и у меня проблема с запросом:
У меня есть две коллекции:
- Коллекция: «output2»: с ‘movieid’, ‘customerid’, ‘rating’, ‘date’
{
"_id" : ObjectId("5c9dc666d73cde2924cc0a4d"),
"movieid" : NumberInt(1),
"customerid" : NumberInt(1488844),
"rating" : NumberInt(3),
"date" : ISODate("2005-09-06T00:00:00.000 0000")
}
- Коллекция: «movie_titles»: с ‘movieid’, ‘year’, ‘title’
{
"_id" : ObjectId("5c9dc68ad73cde2924cd94db"),
"movieid" : NumberInt(1001),
"year" : NumberInt(2001),
"title" : "Blow Dry"
}
Мне нужно найти средний рейтинг за каждый год и месяц, отсортированных по годам и месяцам в порядке возрастания, для фильма «Планета динозавров».
Результат должен выглядеть так:
{
"_id" : NumberInt(515436),
"year" : NumberInt(2001),
"month" : NumberInt(10),
"Average" : 3.0,
"Movietitle": "Dinosaur Planet"
}
Я пытался решить это с помощью разных подходов, но без результата.
db.getCollection("output2").aggregate([
{
"$lookup":
{
from: "movie_titles",
localField: "movieid",
foreignField: "movieid",
as: "movietitle"
}
},
{
"$group": {
"_id": {$year: '$date'},
"Average": { "$avg": "$rating" }
}
},
{
"$match": {
"title": "Dinosaur Planet"
}
}
]);
Нравится этот запрос. Итак, мой вопрос в том, нахожусь ли я на правильном пути или у кого-нибудь есть хорошая идея для решения этой проблемы?
Комментарии:
1. Итак, я не сижу за вашим компьютером, и здесь нет никого, кроме вас. Возможно, вы могли бы рассмотреть возможность показать нам, как на самом деле выглядят документы в коллекциях и как на самом деле должен выглядеть ожидаемый результат от объединения документов, которые вы показываете, и группировки в вашем представлении. Отображение оператора агрегации в порядке, но ему не хватает «контекста», не показывая некоторые данные другим для их работы. Достаточно всего нескольких документов, чтобы воспроизвести ожидаемый результат. Пожалуйста, никаких скриншотов.
2. Спасибо, я отредактировал это. Надеюсь, теперь вопрос лучше.
3. Как эти документы должны соотноситься друг с другом? Когда я говорю «воспроизводимый», я действительно имею в виду, что мы должны иметь возможность использовать эти данные, которые вы нам предоставляете, и возвращать то, что вы ожидаете увидеть. Итак, если у вас есть
movieId
равно1
в одном документе, то связанные документы также должны иметь то же значение. То же самое касается другой коллекции и$lookup
условия. И вы имеете в виду много в любом случае вместо только одного , затем включите несколько документов из этой коллекции. Вот как вы задаете вопрос, подобный этому здесь.
Ответ №1:
Вы должны использовать $match
сразу после $lookup
запроса, и соответствующее поле будет movietitle.title
, а не title
:
db.getCollection("output2").aggregate([
{
"$lookup":
{
from: "movie_titles",
localField: "movieid",
foreignField: "movieid",
as: "movietitle"
}
},
{
"$match": {
"movietitle.title": "Dinosaur Planet"
}
},
{
"$unwind": "$movietitle"
},
{
"$group": {
"_id": {year: '$$ROOT.movietitle.year'},
"Average": { "$avg": "$rating" }
}
}
]);