Сопоставление мастер-коллекции с коллекцией транзакционного статуса - PullRequest
0 голосов
/ 19 февраля 2019

Моя проблема довольно специфична, поэтому я сначала попытаюсь объяснить мои настройки.

У меня есть коллекция с именем 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, откуда я получаю эти данные.Так что просто игнорируйте это.

проблема:

Учитывая deviceSerial, networkId и organizationId, я хочу найти всех клиентов, которые были в сети в любой момент между данным временемframe (с учетом времени начала и времени окончания в секундах эпохи).

Возможный крайний случай: могут быть случаи, когда клиент подключается к сети до заданного времени начала и остается в сети до истечения указанного времени окончания.В этом случае не будет записи транзакции в течение периода времени, но клиент все равно должен рассматриваться как подключенный к сети.

Учет этого случая - это то, с чем у меня больше всего проблем, так как я могу »т просто искать онлайн транзакции между временными рамками.Если во временном интервале нет транзакций для клиента, то мне нужно выполнить поиск за пределами интервала времени, чтобы выяснить, была ли последняя транзакция, совершенная до времени начала для этого клиента, онлайн.

ЯЯ еще не очень разбираюсь в конвейере агрегации, так что я дошел до:

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'
      }
    }
  }
]);

Я думаю, что я на полпути с этим.Он находит все транзакции для уникальных клиентов до времени окончания, но останавливается перед процессом проверки, действительно ли клиент был в сети в течение указанного периода времени.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы ищете всех клиентов, чья последняя активность связана с онлайн-активностью до времени начала или имеет онлайн / офлайн активность между временем начала и окончания.

Так что-то вроде должно работать

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}}
     ]
  }}
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...