はい、可能です。 $group
を追加するだけです _id
を使用したステージ null
に等しい 。これにより、すべての入力ドキュメント全体の累積値が計算されます。例:
{ $group: { _id: null, total: { $sum: "$price" }}}
または、集計結果から1つのドキュメントのみを取得する場合は、$limit
を使用できます。 :
{ $limit: 1 }
更新:これらのソリューションは両方ともカーソルを返します 単一のドキュメントがあります。ただし、findOne
については考えないでください。 特別なものとして。また、カーソルを取得し、最初のドキュメント(存在する場合)を取得します。これがfindOne
のmongoシェル実装です :
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(...)