Как я могу сортировать по $elemMatch в MongoDB?

В моей базе данных MongoDB у меня есть набор продуктов. Каждый продукт содержит информацию о выпуске в виде массива, например.

{
  "name" : "foo",
  "release" : [{
      "region" : "GB",
      "active" : "Y",
      "date" : ISODate("2012-03-01T00:00:00Z")
    }, {
      "region" : "US",
      "active" : "Y",
      "date" : ISODate("2012-09-01T00:00:00Z")
    }, {
      "region" : "FR",
      "active" : "N",
      "date" : ISODate("2010-01-01T00:00:00Z")
    }]
}

Я хочу найти все продукты, находящиеся в активном выпуске в регионе ГБ, и отсортировать результаты по дате выпуска ГБ.

Я попытался сделать это, используя:

db.product.find(
  { "release" : { "$elemMatch" : { "region" : "GB", "active" : "Y" } } }
).sort({ "release.date" : 1 });

Это находит правильные продукты, но не сортирует по дате выпуска из соответствующего элемента (вместо этого сортирует по минимальной дате выпуска из массива).

Из того, что я прочитал до сих пор, похоже, что сортировка по свойствам соответствующего элемента невозможна, это правильно?

Можно ли это сделать с помощью структуры агрегации, и если да, то как?


person nick    schedule 28.02.2013    source источник


Ответы (1)


Вот агрегация, которую вы можете запустить, чтобы получить то, что вы хотите:

db.release.aggregate([
         {$unwind:"$release"},
         {$match:{"release.active":"Y", "release.region":"GB"}},
         {$sort:{"release.date":1}}
])

Это раскручивает массив выпуска, сопоставляет документы по вашим критериям и сортирует выбранные по дате выпуска.

person Asya Kamsky    schedule 28.02.2013