2016-12-06 2 views
3
год

Я использую nodejs и MongoDB для базы данныхMongoose агрегация GroupBy на день, неделю,

Мой документ:

{ 
    "_id": "58466d6a0b3f4d2e2fa22905", 
    "updatedAt": "2016-12-06T07:48:58.435Z", 
    "createdAt": "2017-12-06T07:48:58.435Z", 
    "userId": "56d04e265a2100c72a311334", 
    "__v": 0 
    } 

Пользователь даст FromDate, Todate и частоту в клиентской, в котором значение частоты может быть 0,1,2 где 0 означает день, 1 означает неделю, 2 означает год.

На основании приведенных выше данных я хочу, чтобы генерировать отчет

напр: если пользователь даст FromDate = 2016-12-1 и Todate = 2016-12-6.

, если частота равна 0 результат будет

{ 
    2016-12-01:{ 
    count:1 
      } 
    2016-12-02:{ 
     count:7 
     } 
    2016-12-06:{ 
     count:8 
     } 
    } 

, если частота 1 результат будет

{ 
    2016-12-01 to 2016-12-06:{ 
    count:16 
      } 
    } 

, если частота 2 результат будет

{ 
    2016:{ 
    count:16 
      } 
    } 

В какой отсчет количество документов

Я сделал так:

var aggregate = [{ 
     $match: { 
      createdAt: { 
       $gte: fromDate, 
       $lt: toDate 
      } 
     } 
    }, { 
     $group: { 
      // what should i will do here 
      }, 
      count: { 
       $sum: 1 
      } 
     } 
    }] 

    return LoginReportModel.aggregate(aggregate).exec(); 

ИЛИ Любой один знаю другой лучший подход, как с помощью lodash также приветствуем

Отредактировано: Я также хотелось бы количество документов быть уникальным на userId

ответ

2

C черт из документации на $dateToString

Вы можете сделать это следующим образом:

var frequency = 2 

var frequencyDateFormatMap = { 
    0: '%Y-%m-%d', 
    1: '%U', 
    2: '%Y' 
} 

var frequencyDateFormat = frequencyDateFormatMap[frequency] 

var aggregate = [ 
    {$match: { 
    createdAt: { 
     $gte: fromDate, 
     $lt: toDate 
    } 
    }}, 
    {$project: { 
    frequency: { 
     $dateToString: { 
     format: frequencyDateFormat, 
     date: '$createdAt' 
     } 
    } 
    }}, 
    {$group: { 
    _id: '$frequency', 
    count: { 
     $sum: 1 
    } 
    }} 
] 

return LoginReportModel.aggregate(aggregate).exec() 
+0

вы можете мне помочь на вышеуказанных проблемах – Sam

+0

я добавил пример, единственное отличие состоит в том, что для частоты 1 выводит номер недели как групповой ключ вместо строки типа «2016-12-01 до 2016-12-06». Надеюсь, поможет! – Rudi

+0

Спасибо за помощь! Эта вещь, которую я также могу достичь с помощью $ dayOfMonth и $ year .., но основная проблема - с неделей. Как я могу преобразовать номер этой недели на сегодняшний день, как я упомянул выше, потому что я hv для записи выше данных в файл excel для создания отчета – Sam

Смежные вопросы