mongodb - 如何从给定列mongodb中同时具有相同值的多条记录中获取最后一条记录
问题描述
我有一个名为places_log 的表。地点日志的架构如下
{
'type': {
'type': 'string',
'required': True,
'allowed': ['in', 'out']
},
'fence_name': {
'type': 'string',
'required': True
},
'time': {
'type': 'datetime',
'required': True
}
}
当查询该表的所有文档按栅栏名称和时间排序时,假设输出如下
+------------+---------+-----------+
| fence_name | type | time |
+------------+---------+-----------+
| abc | in | 08:30 |
| abc | in | 08:32 |
| abc | out | 09:45 |
| abc | in | 15:18 |
| abc | out | 16:20 |
| abc | out | 16:25 |
| lmn | in | 12:30 |
| pqr | in | 12:40 |
| pqr | out | 13:52 |
| pqr | out | 13:58 |
| xyz | out | 19:43 |
| xyz | out | 19:45 |
+-------------+--------+-----------+
我想要一个将返回以下结果的查询。对于每个栅栏,当同时有 ins 时,我想要最新的 in,当同时有 out 时,我想要最新的 out。
+------------+---------+-----------+
| fence_name | type | time |
+------------+---------+-----------+
| abc | in | 08:32 |
| abc | out | 09:45 |
| abc | in | 15:18 |
| abc | out | 16:25 |
| lmn | in | 12:30 |
| pqr | in | 12:40 |
| pqr | out | 13:58 |
| xyz | out | 19:45 |
+-------------+--------+-----------+
基本上有一个功能,用户可以在地图上创建多个围栏,我们将存储用户车辆进入或离开围栏的时间。由于某些极端情况,我们会同时获得多个“输入”事件,而没有“输出”事件,这是不可能的。所以我试图提出一个查询,我只能采用最后一个“in”事件(当同时存在 ins 时)并将该时间作为车辆进入围栏的时间。但车辆可以多次进出围栏。所以我也必须了解所有这些来龙去脉
对于以下聚合,使用 group 和 last 进行聚合不会考虑不同时的输入和输出
[
{ "$sort": { "fence_name": 1, "time": 1 } },
{
'$group': {
"_id": {
"fence_name": "$fence_name",
"type": "$type"
},
"time": {
"$last": "$time"
}
}
}
]
我们会得到这样的东西
+------------+---------+-----------+
| fence_name | type | time |
+------------+---------+-----------+
| abc | in | 15:18 |
| abc | out | 16:25 |
| lmn | in | 12:30 |
| pqr | in | 12:40 |
| pqr | out | 13:58 |
| xyz | out | 19:45 |
+-------------+--------+-----------+
在这里,我没有得到车辆第二次进出围栏'abc'
我想获得多个不同时的输入和输出。
如果我能得到这样的东西就更好了
+------------+---------+-----------+
| fence_name | in | out |
+------------+---------+-----------+
| abc | 08:32 | 09:45 |
| abc | 15:18 | 16:25 |
| lmn | 12:30 | null |
| pqr | 12:40 | 13:58 |
| xyz | null | 19:45 |
+-------------+--------+-----------+
解决方案
推荐阅读
- mqtt - 为什么 HAProxy 在 TLS 握手结束时会关闭与 HiveMQ MQTT 客户端的连接?
- node.js - 如何使用 sinon 存根 Winston 记录器
- go - 使用动态结构创建切片
- oracle12c - 交换和拆分分区有问题
- c# - 在 Main 中执行 DateTime 方法
- javascript - 如何获取 MQTT 中的所有主题?
- amazon-web-services - 限制对账户中 AWS 存储桶的访问,同时仍允许访问其他账户中的公共存储桶
- php - Sonata Media Bundle Custom Provider 未映射请求数据
- javascript - 使用 getElementByID 但不使用 querySelectorAll 的事件侦听器
- html - 在同一行左右浮动,但在溢出到第二行时处理不同