Sí, es posible. Solo agrega un $group
escenario con _id
igual a null
. Eso calculará los valores acumulados para todos los documentos de entrada como un todo. Por ejemplo
{ $group: { _id: null, total: { $sum: "$price" }}}
O si desea obtener solo un documento de los resultados agregados, puede usar $limit
:
{ $limit: 1 }
ACTUALIZACIÓN:Ambas soluciones devuelven cursor que tendría documento único. Pero no pienses en findOne
como algo especial. También recupera el cursor y solo obtiene el primer documento (si lo hay). Aquí está la implementación de shell mongo 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;
}
Como puede ver, internamente usa find
. Entonces, si desea obtener un solo documento en lugar de un cursor con un solo documento, puede escribir su propia función que hace lo mismo con aggregate
. Por ejemplo
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Uso:
> db.collection.aggregateOne(...)