Как присоединиться к двум коллекциям MongoDB group?

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Я новичок в MongoDB и у меня проблема с запросом:

У меня есть две коллекции:

  1. Коллекция: «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")
}
  
  1. Коллекция: «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" }
    }
}
]);