От 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)
).