首页 > 解决方案 > 如何从给定列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     |
+-------------+--------+-----------+

标签: mongodbaggregation-framework

解决方案


推荐阅读