Ja, het is mogelijk. Voeg gewoon een $group
toe podium met _id
gelijk aan null
. Dat berekent de geaccumuleerde waarden voor alle invoerdocumenten als geheel. Bijv.
{ $group: { _id: null, total: { $sum: "$price" }}}
Of als u slechts één document wilt krijgen van geaggregeerde resultaten, kunt u $limit
. gebruiken :
{ $limit: 1 }
UPDATE:Beide oplossingen retourneren cursor die één document zou hebben. Maar denk niet aan findOne
als iets bijzonders. Het haalt ook de cursor op en krijgt alleen het eerste document (indien aanwezig). Hier is mongo shell-implementatie van 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;
}
Zoals je kunt zien, gebruikt het intern find
. Dus als u een enkel document wilt krijgen in plaats van een cursor met een enkel document, kunt u uw eigen functie schrijven die hetzelfde doet met aggregate
. Bijv.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Gebruik:
> db.collection.aggregateOne(...)