php - 使用 Laravel 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 库来构建查询。
我的目标是使用 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 语法这一事实。
解决方案
我能够通过使用聚合调用并在此处关注此帖子来解决我的问题。
这是我最终使用的代码,尽管我认为这不是最雄辩的方式:
$result = GPS::raw(function ($collection) {
return $collection->aggregate([
[
'$sort' => [
'created_at' => -1
]
],
[
'$group' => [
'_id' => '$asset_id',
'gps' => [
'$push' => '$$ROOT'
]
]
],
[
'$replaceRoot' => [
'newRoot' => [
'$arrayElemAt' => [
'$gps', 0
]
]
]
]
]);
});
推荐阅读
- asp.net - 无法访问二维码程序中要删除的文件
- infinispan - 如果在 *EMPTY* Infinispan 缓存上进行并行流(分布式)计算,可能出现错误?
- mysql - Lambda NodeJS MySQL 任务超时
- timestamp - Bigquery PARSE_TIMESTAMP 格式为 2018-10-03T23:00:42.690Z
- laravel - 使用自定义频道时未保存 Laravel 通知
- python - 保持字典中值的总和
- python-3.x - IndexError:列表索引超出范围(布洛赫球体)
- sas - SAS 创建具有两个列值的数据集
- sql - SQL如何计算一段时间内发生的事件数?
- javascript - 如何仅在每个 JSON 对象中获取第一个值