Рассчитать среднюю продолжительность из ряда дат - PullRequest
0 голосов
/ 15 мая 2018

Что ж, у меня есть одна коллекция со слишком большим количеством документов (миллионов), и теперь я хочу знать, как рассчитать среднее значение продолжительности сеанса.

Это пример структуры моих документов:

{
    "session" : "xyz",
    "date" : {"$date" : ""Tue May 15 2018 10:35:08 GMT-0400 LT""}
}
{
    "session" : "xyz",
    "date" : {"$date" : ""Tue May 15 2018 12:35:08 GMT-0400 LT""}
}
{
    "session" : "xyz",
    "date" : {"$date" : ""Tue May 15 2018 15:35:08 GMT-0400 LT""}
}
{
    "session" : "abc",
    "date" : {"$date" : ""Tue May 15 2018 09:35:08 GMT-0400 LT""}
}
{
    "session" : "abc",
    "date" : {"$date" : ""Tue May 15 2018 11:35:08 GMT-0400 LT""}
}

И я хочу определить алгоритм следующим образом:

  1. Получить все документы по "$ session"
  2. Рассчитать минимальную (первую) дату и максимальную (последнюю) дату этих (2-х точечных) документов.
  3. Рассчитать продолжительность (разницу во времени) по сеансу
  4. Повторить первый 1-й пункт с другой "$ session"
  5. после вычисления всех средних по "$ session", вычислите среднее из этих итогов.

Я думаю, что сначала нужно использовать aggregate с $ group, но у меня нет опыта с этим, и теперь у меня есть экзистенциальная проблема, хахаха

Спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Пока «последовательность» здесь не важна, тогда $min и $max являются правильными вещами:

db.collection.aggregate([
  { "$group": {
    "_id": "$session",
    "minDate": { "$min": "$date" },
    "maxDate": { "$max": "$date" }
  }},
  { "$group": {
    "_id": null,
    "avg": {
      "$avg": { "$subtract": [ "$maxDate", "$minDate" ] }
    }
  }}
])

Исходное значение $group получает значения $min и $max из предоставленного «ключа группировки», который является значением "session" в документе.Второй $group выполняется без какого-либо ключа группировки (или null) для накопления «всего».

Когда вы $subtract одинBSON Дата от другого, тогда результатом будет разница в миллисекундах.Это также способ передачи числовых значений в целом.Но все, что вы делаете, это $subtract, два значения выводятся из $min и $max и подаете это в $avg*Аккумулятор 1040 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...