Sim, é possível. Basta adicionar um
$group
estágio com _id
igual a null
. Isso calculará os valores acumulados para todos os documentos de entrada como um todo. Por exemplo. { $group: { _id: null, total: { $sum: "$price" }}}
Ou se você deseja obter apenas um documento dos resultados agregados, pode usar
$limit
:{ $limit: 1 }
ATUALIZAÇÃO:Ambas as soluções retornam cursor que teria documento único. Mas não pense em
findOne
como algo especial. Ele também recupera o cursor e apenas obtém o primeiro documento (se houver). Aqui está a implementação do 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 você pode ver, ele usa internamente
find
. Portanto, se você deseja obter um único documento em vez de um cursor com um único documento, pode escrever sua própria função que faz o mesmo com aggregate
. Por exemplo. > DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Uso:
> db.collection.aggregateOne(...)