我有一个名为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时,我需要最新的输入;而当同时存在ins时,我想要最新的输出。
+------------+---------+-----------+
| 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 |
+-------------+--------+-----------+