Ano, je to možné. Stačí přidat $group fázi s _id rovno null . Tím se spočítají akumulované hodnoty pro všechny vstupní dokumenty jako celek. Např.
{ $group: { _id: null, total: { $sum: "$price" }}}
Nebo pokud chcete získat pouze jeden dokument z agregovaných výsledků, můžete použít $limit :
{ $limit: 1 }
AKTUALIZACE:Obě tato řešení vrací kurzor který by měl jeden dokument. Ale nemyslete na findOne jako něco speciálního. Také načte kurzor a pouze získá první dokument (pokud existuje). Zde je mongo shell implementace 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;
}
Jak vidíte, interně používá find . Pokud tedy chcete získat jeden dokument místo kurzoru s jedním dokumentem, můžete si napsat vlastní funkci, která dělá to samé s aggregate . Např.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Použití:
> db.collection.aggregateOne(...)