Ya, itu mungkin. Cukup tambahkan $group
panggung dengan _id
sama dengan null
. Itu akan menghitung nilai akumulasi untuk semua dokumen input secara keseluruhan. Mis.
{ $group: { _id: null, total: { $sum: "$price" }}}
Atau jika Anda ingin mendapatkan hanya satu dokumen dari hasil agregat, Anda dapat menggunakan $limit
:
{ $limit: 1 }
PEMBARUAN:Kedua solusi ini mengembalikan kursor yang akan memiliki satu dokumen. Tapi jangan pikirkan findOne
sebagai sesuatu yang istimewa. Itu juga mengambil kursor dan hanya mendapatkan dokumen pertama (jika ada). Ini adalah implementasi mongo shell dari 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;
}
Seperti yang Anda lihat, secara internal menggunakan find
. Jadi, jika Anda ingin mendapatkan satu dokumen alih-alih kursor dengan satu dokumen, Anda dapat menulis fungsi Anda sendiri yang melakukan hal yang sama dengan aggregate
. Mis.
> DBCollection.prototype.aggregateOne = function(pipeline) {
var cur = this.aggregate(pipeline);
if (!cur.hasNext())
return null;
return cur.next();
}
Penggunaan:
> db.collection.aggregateOne(...)