उल्का v1.0.4 के अनुसार:
तो आप collection.rawCollection()
पर कॉल कर सकते हैं अंतर्निहित संग्रह वस्तु प्राप्त करने के लिए:
var rawCollection = Orders.rawCollection();
यह rawCollection
एक विधि है group
जो group
. के बराबर है MongoDB शेल में विधि। अंतर्निहित नोड एपीआई एसिंक्रोनस है, हालांकि, आप इसे किसी भी तरह एक सिंक्रोनस फ़ंक्शन में कनवर्ट करना चाहेंगे। हम Meteor.wrapAsync
. का उपयोग नहीं कर सकते सीधे group
. के बाद से फ़ंक्शन तर्क लेता है जो प्राथमिक कॉलबैक नहीं हैं, इसलिए हम इसके लिए एक रैपर के साथ काम करेंगे:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
अपने तरीके के अंदर, आप ordersGroup
. पर कॉल कर सकते हैं जैसे आप db.orders.group
मोंगो खोल में। हालांकि, तर्कों को एक वस्तु के बजाय अलग से पारित किया जाता है:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
अधिक जानकारी के लिए, यह दस्तावेज़ देखें
(हालांकि ध्यान दें कि callback
पैरामीटर को छोड़ दिया जाना चाहिए, क्योंकि हमारा एसिंक-रैपिंग इसका ख्याल रखता है)।
तो आपको उन्हें अलग से पास करना होगा:
var result = ordersGroup(
// keys
function(doc) {
return { year: doc.createdAt.toISOString().substring(0, 4) };
},
// condition
{createdAt: {$lt: new Date("2015-12-31"), $gt: new Date("2015-01-01")}},
// initial
{months: {}},
// reduce
function(order, result) {
var month = order.createdAt.getMonth()+1,
date = order.createdAt.getDate();
month = result.months[month] || (result.months[month] = {});
date = month[date] || (month[date] = []);
date.push(order);
}
);
बेशक, यह केवल सर्वर पर काम करता है, इसलिए सुनिश्चित करें कि आपकी विधि केवल सर्वर कोड में है (अधिमानतः server
में) उपनिर्देशिका, या किसी if (Meteor.isServer)
. के अंदर )।