От Meteor v1.0.4:
Така че можете да извикате collection.rawCollection() за да получите основния обект на колекция:
var rawCollection = Orders.rawCollection();
Тази rawCollection има метод group което е еквивалентно на group метод в обвивката на MongoDB. API на основния възел обаче е асинхронен, така че ще искате да го преобразувате по някакъв начин в синхронна функция. Не можем да използваме 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 в обвивката Mongo. Аргументите обаче се предават отделно, а не в обект:
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) ).