如何从给定列mongodb中同时具有相同值的多个记录中获取最后一条记录

时间:2018-08-07 08:37:39

标签: mongodb aggregation-framework

我有一个名为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     |
+-------------+--------+-----------+

0 个答案:

没有答案