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