Да, възможно е. Просто добавете $group
етап с _id
равно на null
. Това ще изчисли натрупаните стойности за всички входни документи като цяло. Напр.
{ $group: { _id: null, total: { $sum: "$price" }}}
Или ако искате да получите само един документ от обобщени резултати, можете да използвате $limit
:
{ $limit: 1 }
АКТУАЛИЗАЦИЯ:И двете решения връщат курсор което би имало единичен документ. Но не мислете за findOne
като нещо специално. Той също така извлича курсора и просто получава първия документ (ако има такъв). Ето реализация на mongo shell на 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;
}
Както можете да видите, той вътрешно използва find
. Така че, ако искате да получите един документ вместо курсор с един документ, можете да напишете своя собствена функция, която прави същото с aggregate
. Напр.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Употреба:
> db.collection.aggregateOne(...)