Ja det är möjligt. Lägg bara till en $group
steg med _id
lika med null
. Det kommer att beräkna ackumulerade värden för alla indatadokument som helhet. T.ex.
{ $group: { _id: null, total: { $sum: "$price" }}}
Eller om du bara vill få ett dokument från aggregerade resultat kan du använda $limit
:
{ $limit: 1 }
UPPDATERING:Båda dessa lösningar returnerar markör som skulle ha ett enda dokument. Men tänk inte på findOne
som något speciellt. Den hämtar också markören och får bara det första dokumentet (om något). Här är mongo-skalimplementeringen av 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;
}
Som du kan se använder den internt find
. Så om du vill få ett enda dokument istället för markör med ett enda dokument, kan du skriva din egen funktion som gör samma sak med aggregate
. T.ex.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Användning:
> db.collection.aggregateOne(...)