2015-05-11 2 views
1

Я пытаюсь объединить документы по дате с рамкой агрегации Mongo. Я пробовал кучу вещей и не могу определить проблему. Мой запрос выглядит следующим образом:Группа по дате Mongo aggregation

// get current date and then get the date 8 months ago 
var now = Date.now() 
var lastMonth = 60*60*24*30*1000*8 
lastMonth = now - lastMonth 

var query = { 
       type: 'something', 
       deleted: {$ne: true}, 
       created: {$gte: lastMonth} 
      } 

    var stickerNames = []; 
    db.Message.aggregate([{$match: query}, 
     {$group: 
      {_id: {data: '$data', 
        month: {$month: '$created'}, 
        year: {$year: '$created'} 
        }, 
      count:{$sum: 1} 
      } 
     }, 
     {$sort: 
      {count: 1}}], 
     function(err, stuff){ 
      if(err){ 
       return res.json({error: err.message}) 
      } 
      else{ 
       return res.json({data: stuff}) 
      } 
    }) 

Я пробовал кучу разных вещей с датами и проверил другие SO сообщения, но ничего не работает до сих пор. Если я выберу созданное предложение: {$ gte: lastMonth}, он возвращает каждый документ типа «что-то». Если я оставлю его, он не вернет документы.

Созданное поле устанавливается в модели

created: {type: Date, default: Date.now} 
+1

Свидание объект минус число возвращает значение временной метки, а не количество миллисекунд. Вы должны делать: 'lastMonth = new Date (now - lastMonth)' ' –

ответ

2

Насколько я понимаю, «группа по дате» означает группу, «день-месяц-год». Может быть, вам не хватает функции агрегации $dayOfMonth?

Учитывая этот набор образцов данных:

> db.w.find({}) 
{ "_id" : ObjectId("55503d31a3d32cf6295ad897"), 
    "created" : ISODate("2014-12-08T12:00:00Z"), 
    "data" : 1 } 
{ "_id" : ObjectId("55503d43a3d32cf6295ad898"), 
    "created" : ISODate("2014-12-08T08:00:00Z"), 
    "data" : 2 } 
{ "_id" : ObjectId("55503d4ba3d32cf6295ad899"), 
    "created" : ISODate("2014-12-08T20:00:00Z"), 
    "data" : 3 } 
{ "_id" : ObjectId("55503d55a3d32cf6295ad89a"), 
    "created" : ISODate("2014-12-06T20:00:00Z"), 
    "data" : 4 } 
{ "_id" : ObjectId("55503d77a3d32cf6295ad89c"), 
    "created" : ISODate("2015-12-08T20:00:00Z"), 
    "data" : 5 } 

И что совокупный трубопровод:

> db.w.aggregate([ 
     {$group: 
     { 
      _id: 
      { 
       day: {$dayOfMonth: "$created"}, 
       month: {$month: "$created"}, 
       year: {$year: "$created"} 
      }, 
      total: {$sum: "$data"}, 
      count: {$sum: 1} 
      } 
     }, 
     {$sort: {count: 1}} 
]) 

вы получите обратно ожидаемый результат:

{ "_id" : { "day" : 8, "month" : 12, "year" : 2015 }, "total" : 5, "count" : 1 } 
{ "_id" : { "day" : 6, "month" : 12, "year" : 2014 }, "total" : 4, "count" : 1 } 
{ "_id" : { "day" : 8, "month" : 12, "year" : 2014 }, "total" : 6, "count" : 3 } 
+0

Я хочу группировать по месяцам. Все «вещи» за последний месяц или два месяца назад и т. Д. ... – user137717

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