Od verze Meteor v1.0.4:
Můžete tedy zavolat collection.rawCollection()
k získání základního objektu kolekce:
var rawCollection = Orders.rawCollection();
Tato rawCollection
má metodu group
což je ekvivalentní group
metoda v prostředí MongoDB. Základní API uzlu je však asynchronní, takže jej budete chtít nějak převést na synchronní funkci. Nemůžeme použít Meteor.wrapAsync
přímo od group
přebírá argumenty funkcí, které nejsou primárním zpětným voláním, takže to vyřešíme pomocí wrapperu:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Uvnitř své metody můžete volat ordersGroup
jako byste db.orders.group
ve skořápce Mongo. Argumenty se však předávají samostatně, nikoli v objektu:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Další informace naleznete v této dokumentaci
(ačkoli mějte na paměti, že callback
parametr by měl být vynechán, protože se o to postará naše asynchronní balení).
Budete je tedy muset předat samostatně:
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);
}
);
Samozřejmě to funguje pouze na serveru, takže se ujistěte, že je vaše metoda v kódu pouze pro server (nejlépe v server
podadresář nebo uvnitř if (Meteor.isServer)
).