Il primo passaggio sarà la creazione di oggetti data che rappresentano il tuo intervallo. Supponiamo che tu voglia eseguire la tua operazione di aggregazione per il gioco 8-15 giorni fa, questo significa che hai bisogno di due oggetti data, diciamo inizio e fine. start terrà la data un giorno fa e terminerà con la data di 8 giorni fa.La creazione di questi oggetti di data è facile come loro impostazione per il numero di giorni precedenti sottraendo n
a partire dalla data in cui n
è il numero di giorni fa:
var start = new Date();
start.setDate(start.getDate() - 8);
var end = new Date();
end.setDate(end.getDate() - 15);
o sottraendo dai millisecondi timestamp utilizzando .getTime()
metodo restituisce un JavaScript standard timestamp (millisecondi dal Jan 1/1970
) su cui è possibile utilizzare operazioni matematiche regolari, e reimmessa alla Data di oggetto direttamente:
var today = new Date();
var start = new Date(today.getTime() - 8*24*60*60*1000);
var end = new Date(today.getTime() - 15*24*60*60*1000);
Ora che avete gli oggetti data, è possibile poi utilizzare come $match
criteri, utilizzando i $lte
e $gte
confronto operatori:
var pipeline = [
{
"$match": {
"date": { "$lte": start, "$gte": end }
}
}
]
in corso l'aggregazione in questa fase vi darà tutti i documenti che hanno la data che cade nel range 8-15 giorni fa,
db.aggregate(pipeline);
che è equivalente alla query find()
:
db.collection.find({
"date": { "$lte": start, "$gte": end }
});
Ora, alla fase successiva gasdotto, si avrebbe bisogno di creare un'operazione di aggregazione che specifica un gruppo _id
di null, calcolo del valore totale e i conteggi per tutti i documenti della collezione utilizzando l'operatore $sum
accumulatore :
var pipeline = [
{
"$match": {
"date": { "$lte": start, "$gte": end }
}
},
{
"$group": {
"_id": null,
"totalValues": { "$sum": "$value" },
"count": { "$sum": 1 }
}
}
]
db.collection.aggregate(pipeline);
Si può anche andare oltre per creare una funzione generica che restituisce il totale effettivo dall'operazione di aggregazione di cui sopra che prende in due parametri, il valore iniziale dell'intervallo di date e la fine:
var getTotalValues = function(start, end){
var today = new Date();
var startDate = new Date(today.getTime() - start*24*60*60*1000);
var endDate = new Date(today.getTime() - end*24*60*60*1000);
var pipeline = [
{
"$match": {
"timestamp": { "$lte": startDate, "$gte": endDate }
}
},
{
"$group": {
"_id": null,
"totalValues": { "$sum": "$value" },
"count": { "$sum": 1 }
}
}
],
resultArray = db.collection.aggregate(pipeline).toArray();
return resultArray[0].totalValues;
}
var total = getTotalValues(1, 8);
printjson(total); // prints the total
Non penso che si possa fare tutto in una volta.Dovresti davvero andare per 3 conteggio –
@MateoBarahona ovviamente puoi farlo tutto in una volta. Questo è in gran parte ciò che operatori come ['$ cond'] (https://docs.mongodb.org/v3.0/reference/operator/aggregation/cond/) sono in realtà per. –
@Blakes Seven: Ho ragione, –