Oui c'est possible. Ajoutez simplement un $group étape avec _id égal à null . Cela calculera les valeurs cumulées pour tous les documents d'entrée dans leur ensemble. Par exemple
{ $group: { _id: null, total: { $sum: "$price" }}}
Ou si vous souhaitez obtenir un seul document à partir des résultats agrégés, vous pouvez utiliser $limit :
{ $limit: 1 }
MISE À JOUR :ces deux solutions renvoient le curseur qui aurait un document unique. Mais ne pensez pas à findOne comme quelque chose de spécial. Il récupère également le curseur et obtient simplement le premier document (le cas échéant). Voici l'implémentation mongo shell de 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;
}
Comme vous pouvez le voir, il utilise en interne find . Donc, si vous voulez obtenir un seul document au lieu d'un curseur avec un seul document, vous pouvez écrire votre propre fonction qui fait la même chose avec aggregate . Par exemple
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Utilisation :
> db.collection.aggregateOne(...)