【问题标题】:Matching a master collection to a transactional status collection将主集合与事务状态集合匹配
【发布时间】:2019-02-22 06:50:48
【问题描述】:

我的问题比较具体,所以我会先尝试解释我的设置。

我有一个名为clients 的集合,它是所有客户端的主列表。它的型号是:

{
    id: String,
    organizationId: Number,
    networkId: String,
    deviceSerial: String,
}

(删除无关属性)

我还有一个名为clienttransactions 的集合,它是客户在线或离线时间的列表。因此,每次客户端上线时,它都会添加一条记录说它上线(online: true),反之亦然,当客户端下线时(online: false)。模型如下所示:

{
    clientId: String,
    deviceSerial: String,
    networkId: String,
    organizationId: Number,
    ts: Number,
    online: Boolean
}

ts 是以秒为单位的 unix 时间戳。另外,如果您想知道为什么我在每条记录上都需要所有这些外键,那是因为我从中获取这些数据的 API 的工作方式。所以请忽略它。

问题:

给定 deviceSerialnetworkIdorganizationId,我想查找在给定时间范围内的任何时间点在线的所有客户端(以纪元秒为单位给出开始时间和结束时间)。

可能的边缘情况:有时客户端可能在给定的开始时间之前上线,并在给定的结束时间之后一直在线。在这种情况下,时间范围内不会有交易记录,但客户端仍应被视为在线。

这个案例的会计是我最麻烦的,因为我不能简单地搜索时间范围之间的在线交易。如果在时间范围内没有客户的交易,那么我需要在时间范围之外进行搜索,以查看在该客户的开始时间之前进行的最后一笔交易是否是在线交易。

我还不是非常精通聚合管道,所以就我所知:

const startTime = 1550601742;
const endTime = 1550599341;

ClientTransaction.aggregation([
  {
    $match: {
      organizationId: 600381,
      networkId: 'N_651896046061895525',
      deviceSerial: 'Q2MN-3CUN-6GQM',
      ts: {$lt: endTime}
    }
  },
  {
    $group: {
      _id: '$clientId',
      lastStatus: {
        $max: '$ts'
      },
      online: {
        $last: '$online'
      }
    }
  }
]);

我想我已经完成了一半。它会在结束时间之前查找唯一客户端的所有事务,但在检查客户端在该时间范围内是否实际在线之前停止。

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您正在寻找其最新活动是开始时间之前的在线活动或在开始时间和结束时间之间有在线/离线活动的所有客户。

    所以类似的东西应该可以工作

    ClientTransaction.aggregation([
      { $match: { 
          organizationId: 600381, 
          networkId: 'N_651896046061895525',
          deviceSerial: 'Q2MN-3CUN-6GQM',
          ts: {$lte: endTime}
        }
      },
      { $sort:{"clentId":1, "ts":-1 } },
      { $group: {
          _id: '$clientId',
          latest: {
            $first: '$$ROOT'
          }
      }},
      { $match:{
         $or:[
           {"latest.online":true,"latest.ts":{$lt:startTime}},
           {"latest.ts":{$gte:startTime, $lte:endTime}}
         ]
      }}
    ]);
    

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多