2013-06-25 2 views
0

У меня есть коллекцияMongoDB Агрегация рамки и временная метка

{ "_id" : 1325376000, "value" : 13393} 
{ "_id" : 1325462400, "value" : 13393} 

ObjectIds являются Отметка времени Unix и хранение как номер вручную. (Во время вставки).

сейчас я ищу решение, которое я мог бы рассчитать сумму значений за каждый месяц с помощью Aggregation Framework.

+1

Вы должны были бы изменить 'значения _id' быть' date' объектов вместо цифр. – JohnnyHK

+0

Документы на комментарий @JohnnyHK: http://docs.mongodb.org/manual/reference/aggregation/#date-operators – WiredPrairie

+0

с использованием типа даты вместо timestump является дорогостоящим. –

ответ

2

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

numberOfMonths=24; /* number of months you want to go back from today's */ 
now=new Date(); 
year=now.getFullYear(); 
mo=now.getMonth(); 
months=[]; 
for (i=0;i<numberOfMonths;i++) { 
     m1=mo-i+1; m2=m1-1; 
     d = new Date(year,m1,1); 
     d2=new Date(year,m2,1); 
     from= d2.getTime()/1000; 
     to= d.getTime()/1000; 
     dt={from:from, to:to, month:d2}; months.push(dt); 
} 
prev="$nothing"; 
cond={}; 
months.forEach(function(m) { 
     cond={$cond: [{$and :[ {$gte:["$_id",m.from]}, {$lt:["$_id",m.to]} ]}, m.month, prev]}; 
     prev=cond; 
}); 

/* now you can use "cond" variable in your pipeline to generate month */ 
db.collection.aggregate({ $project: { month: cond , value:1 } }, 
         { $group: {_id:"$month", sum:{$sum:"$value"} } } 
) 
+0

Очевидно, вы можете добавить {$ sort} после группы, вы также можете вычислить $ avg или $ min или что-нибудь еще, если $ sum не то, что вы хотите. –