Sì, è possibile. Basta aggiungere un $group
fase con _id
uguale a null
. Ciò calcolerà i valori accumulati per tutti i documenti di input nel loro insieme. Es.
{ $group: { _id: null, total: { $sum: "$price" }}}
Oppure, se desideri ottenere un solo documento dai risultati aggregati, puoi utilizzare $limit
:
{ $limit: 1 }
AGGIORNAMENTO:entrambe queste soluzioni restituiscono cursore che avrebbe un unico documento. Ma non pensare a findOne
come qualcosa di speciale. Recupera anche il cursore e ottiene solo il primo documento (se presente). Ecco l'implementazione della shell mongo di findOne
:
function ( query , fields, options ){
var cursor = this.find(query, fields, -1 /* limit */, 0 /* skip*/,
0 /* batchSize */, options);
if ( ! cursor.hasNext() )
return null;
var ret = cursor.next();
if ( cursor.hasNext() ) throw "findOne has more than 1 result!";
if ( ret.$err )
throw "error " + tojson( ret );
return ret;
}
Come puoi vedere, internamente utilizza find
. Quindi, se vuoi ottenere un singolo documento invece del cursore con un singolo documento, puoi scrivere la tua funzione che fa lo stesso con aggregate
. Es.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Utilizzo:
> db.collection.aggregateOne(...)