हाँ यह संभव है। बस एक $group
जोड़ें _id
. के साथ चरण null
. के बराबर . यह समग्र रूप से सभी इनपुट दस्तावेजों के लिए संचित मूल्यों की गणना करेगा। उदा.
{ $group: { _id: null, total: { $sum: "$price" }}}
या यदि आप समेकित परिणामों से केवल एक दस्तावेज़ प्राप्त करना चाहते हैं, तो आप $limit
. का उपयोग कर सकते हैं :
{ $limit: 1 }
अद्यतन:ये दोनों समाधान कर्सर लौटाते हैं जिसमें सिंगल डॉक्यूमेंट होगा। लेकिन findOne
के बारे में न सोचें कुछ खास के रूप में। यह कर्सर को भी पुनः प्राप्त करता है और केवल पहला दस्तावेज़ (यदि कोई हो) प्राप्त करता है। यहाँ 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(...)