Найти разницу в дате двух документов - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть коллекция, содержащая документы ниже:

{ type: 1,
  user: 1,
  date: "2019-01-01 11:52"
},
{ type: 1,
  user: 2,
  date: "2019-01-01 11:55"
},
{ type: 2,
  user: 2,
  date: "2019-01-01 12:02"
},
{ type: 2,
  user: 1,
  date: "2019-01-01 12:10"
},

, и я хочу найти время, потраченное между типами и для одного и того же пользователя.Например:

{ user: 1,
  time: 18// minutes
},
{ user: 2,
  time: 7
}

Как это возможно с мангустом?

Ответы [ 2 ]

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

Использование Вычитание

Вычитание двух чисел, чтобы вернуть разницу, или двух дат, чтобы вернуть разницу в миллисекундах, или даты и числа в миллисекундах, чтобы вернуть полученную дату.

{ $subtract: [ <expression1>, <expression2> ] }
0 голосов
/ 28 февраля 2019

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

  • Получить коллекцию из MongoDB с помощью функции find ().

  • Создать новый пустойобъект для хранения ваших результатов.

  • Цикл по каждому документу в коллекции:

  • Если идентификатор пользователя не существует в объекте результатовдобавьте пользователя в объект результатов вместе с его типом и датой.

  • Если идентификатор пользователя уже существует в объекте результатов, рассчитайте разницу во времени между этим документом и ранее сохраненной датой.в объекте результатов.

  • Удалите тип и дату из коллекции результатов.

Код (не проверено)

/* Get the collection from MongoDB. */
collection_name.find({}, function (err, collection) {
    if (err) {
      return console.log(err);
    } else {
        /* Create results object */
        var results = {};
        /* Loop over each document in the collection. */
        for(doc in collection){
            /* If the user doesn't exist in the results object. */
            if(typeof results[doc.user] == 'undefined'){
                /* Add the user to the results object. */
                results[doc.user] = {"type": doc.type, "date": doc.date};
            }
            /* If the user already exists in the results object. */
            else if(typeof results[doc.user] != 'undefined'){
                /* Calculate the time difference in milliseconds. */
                var diff = Math.abs(new Date(results[doc.user].date) - new Date(doc.date));
                /* Convert to minuets and save to results. */
                results[doc.user].time = Math.floor((diff/1000)/60);
                /* Remove date and type from results. */
                delete results[doc.user].date;
                delete results[doc.user].type;
            }
         }
         console.log(results);
     }
});

Полученныйобъект должен выглядеть примерно так:

{
 1: {
  "time": 3 
 },
 2: {
  "time": 5
 },
 3: {
  "time": 2 
 },
 4: {
  "time": 4 
 }
}

Ключом в объекте результатов является идентификатор пользователя.Эта программа рассчитывает абсолютную разницу во времени между двумя датами из двух документов с разными типами на пользователя в минутах.Код будет немного сложнее, если вы захотите рассчитать разницу во времени между более чем двумя типами.

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