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(...)