Ja, det er muligt. Bare tilføj en $group
trin med _id
lig med null
. Det vil beregne akkumulerede værdier for alle inputdokumenter som helhed. F.eks.
{ $group: { _id: null, total: { $sum: "$price" }}}
Eller hvis du kun vil have ét dokument fra aggregerede resultater, kan du bruge $limit
:
{ $limit: 1 }
OPDATERING:Begge disse løsninger returnerer markør som ville have et enkelt dokument. Men tænk ikke på findOne
som noget særligt. Den henter også markøren og får bare det første dokument (hvis nogen). Her er mongo shell implementering af 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, bruger den internt find
. Så hvis du ønsker at få et enkelt dokument i stedet for markør med et enkelt dokument, kan du skrive din egen funktion, som gør det samme med aggregate
. F.eks.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Brug:
> db.collection.aggregateOne(...)