通过Laravel MongoDB获取每个组的最新行

时间:2018-11-05 07:28:59

标签: php database mongodb laravel jenssegers-mongodb

我在MongoDB中有一个名为gps的表,如下所示:


| 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来进行查询构建。

我的目标是像本question所述,使用group by子句获取每个资产的最新坐标,只不过它必须利用前面提到的Laravel MongoDB库。我尝试查看的另一个示例是this post

基本上我应该把这个还给我:


| 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语法。< / p>

2 个答案:

答案 0 :(得分:0)

您应该尝试以下操作:

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

答案 1 :(得分:0)

我能够通过使用聚集调用并遵循this post here来解决我的问题。

这是我最终使用的代码,尽管我认为这不是最口才的方法:

$result = GPS::raw(function ($collection) {
    return $collection->aggregate([
        [
            '$sort' => [
                'created_at' => -1
            ]
        ],
        [
            '$group' => [
                '_id' => '$asset_id', 
                'gps' => [
                    '$push' => '$$ROOT'
                ]
             ]
        ],
        [
            '$replaceRoot' => [
                'newRoot' => [
                    '$arrayElemAt' => [
                        '$gps', 0
                    ]
                ]
            ]
        ]
    ]);
});