我在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>
答案 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
]
]
]
]
]);
});