Получить последний ряд каждой группы с помощью Laravel MongoDB
У меня есть таблица с именем gps в MongoDB, которая выглядит следующим образом:
| id | asset_id | coordinates | created_at |
--------------------------------------------
| 1 | 11 | 23,-26 | 2018-11-05 |
| 2 | 22 | 33,-36 | 2018-10-04 |
| 3 | 33 | 23,-27 | 2018-11-01 |
| 4 | 33 | 31,-26 | 2018-10-05 |
| 5 | 11 | 23,-46 | 2018-11-02 |
| 6 | 22 | 32,-21 | 2018-11-01 |
--------------------------------------------
Я использую Laravel и библиотеку Laravel MongoDB для построения запросов.
Моя цель - получить последнюю координату каждого актива с помощью предложения group by, как было задано в этом вопросе, только для этого потребуется использовать библиотеку Laravel MongoDB, упомянутую ранее. Другой пример, на который я пытался взглянуть, был этот пост.
По сути, я должен был вернуть это мне:
| id | asset_id | coordinates | created_at |
--------------------------------------------
| 1 | 11 | 23,-26 | 2018-11-05 |
| 3 | 33 | 23,-27 | 2018-11-01 |
| 6 | 22 | 32,-21 | 2018-11-01 |
--------------------------------------------
Я предполагаю, что эти примеры не сработали для меня, потому что у меня нет доступа ко всем функциям Eloquent с этой библиотекой, только несколько основных, а также тот факт, что я не могу использовать синтаксис SQL в моем построителе запросов.
2 ответа
Я смог решить мою проблему, используя совокупные вызовы и следуя этой записи здесь.
Это код, который я в конечном итоге использовал, хотя я не думаю, что это самый красноречивый из возможных способов:
$result = GPS::raw(function ($collection) {
return $collection->aggregate([
[
'$sort' => [
'created_at' => -1
]
],
[
'$group' => [
'_id' => '$asset_id',
'gps' => [
'$push' => '$$ROOT'
]
]
],
[
'$replaceRoot' => [
'newRoot' => [
'$arrayElemAt' => [
'$gps', 0
]
]
]
]
]);
});
Вы должны попробовать это:
DB::table('gps')->orderBy('created_at','desc')->groupBy('asset_id')->get();