Получить последний ряд каждой группы с помощью Laravel MongoDB - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть таблица с именем 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 Library , чтобы использовать для построения запросов.

Моя цель - получить последнюю координату каждого актива, используя предложение 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 ]

0 голосов
/ 05 ноября 2018

Я смог решить мою проблему, используя совокупные вызовы и следуя этому сообщению здесь .

Это код, который я в конечном итоге использовал, хотя я не думаю, что это самый красноречивый из возможных способов:

$result = GPS::raw(function ($collection) {
    return $collection->aggregate([
        [
            '$sort' => [
                'created_at' => -1
            ]
        ],
        [
            '$group' => [
                '_id' => '$asset_id', 
                'gps' => [
                    '$push' => '$$ROOT'
                ]
             ]
        ],
        [
            '$replaceRoot' => [
                'newRoot' => [
                    '$arrayElemAt' => [
                        '$gps', 0
                    ]
                ]
            ]
        ]
    ]);
});
0 голосов
/ 05 ноября 2018

Вы должны попробовать это:

DB::table('gps')->orderBy('created_at','desc')->groupBy('asset_id')->get();
...