Tak to mozliwe. Po prostu dodaj $group
etap z _id
równe null
. Spowoduje to obliczenie skumulowanych wartości dla wszystkich dokumentów wejściowych jako całości. Np.
{ $group: { _id: null, total: { $sum: "$price" }}}
Lub jeśli chcesz uzyskać tylko jeden dokument z zagregowanych wyników, możesz użyć $limit
:
{ $limit: 1 }
AKTUALIZACJA:oba te rozwiązania zwracają kursor który miałby jeden dokument. Ale nie myśl o findOne
jako coś wyjątkowego. Pobiera również kursor i po prostu pobiera pierwszy dokument (jeśli istnieje). Oto implementacja powłoki mongo 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 widać, wewnętrznie używa find
. Tak więc, jeśli chcesz uzyskać pojedynczy dokument zamiast kursora z pojedynczym dokumentem, możesz napisać własną funkcję, która robi to samo z aggregate
. Np.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Użycie:
> db.collection.aggregateOne(...)