Получение последней записи в каждой группе - MongoDB - PullRequest
0 голосов
/ 10 февраля 2020

Существует коллекция элементов со следующими полями:

id   item_id  quantity    last_update
-------------------------------------------
1    111         10        2020-02-10 09:00:00
2    222         10        2020-02-10 09:00:00
2    222         15        2020-02-10 10:00:00

Я хочу получить последнюю обновленную запись для каждой группы по id и item_id. Результаты должны быть:

id   item_id  quantity    last_update
-------------------------------------------
1    111         10        2020-02-10 09:00:00
2    222         15        2020-02-10 10:00:00

Если бы это было SQL, то я бы сделал что-то вроде:

SELECT a.* FROM items a JOIN
( SELECT id ,item_id , max(last_update) as max_last_update
FROM items ) as b ON a.id=b.id AND a.item_id=b.item_id AND a.last_update=b.max_last_update

(или используя самосоединение).

Я новичок в mongoDB, я выполнил внутренний запрос следующим образом:

inner_query = db.items.aggregate({ $group : { _id: {id:"$id" , item_id:"$item_id"}, max_last_update: { $max : "$last_update" }}})

Как я могу использовать inner_query var для получения ожидаемых результатов? Что эквивалентно в Mon go JOIN или подзапросе? (я использую mongodb 4.0.4)

Спасибо!

1 Ответ

0 голосов
/ 10 февраля 2020

Попробуйте это:

db.collection.aggregate([
   { $sort: { id: 1, item_id: 1, last_update: -1 } },
   {
      $group: {
         _id: { id: "$id", item_id: "$item_id" },
         last_update: { $max: "$last_update" },
         quantity: { $first: "$quantity" },
      }
   },
   {
      $project: {
         last_update: 1,
         quantity: 1,
         id: "$_id.id",
         item_id: "$_id.item_id",
         _id: 0
      }
   }
])

Обратите внимание, укажите $sort, иначе $frist вернет неправильное значение.

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