Fra Meteor v1.0.4:
Så du kan kalde collection.rawCollection() for at hente det underliggende samlingsobjekt:
var rawCollection = Orders.rawCollection();
Denne rawCollection har en metode group hvilket svarer til group metode i MongoDB-skallen. Den underliggende node API er dog asynkron, så du vil på en eller anden måde konvertere den til en synkron funktion. Vi kan ikke bruge Meteor.wrapAsync direkte siden group tager funktionsargumenter, der ikke er det primære tilbagekald, så vi løser dette med en indpakning:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Inde i din metode kan du kalde ordersGroup ligesom du ville db.orders.group i Mongo-skallen. Argumenterne sendes dog separat i stedet for i et objekt:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
For flere oplysninger, se denne dokumentation
(selvom bemærk, at callback parameter bør udelades, da vores async-wrapping tager sig af det).
Så du skal sende dem separat:
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);
}
);
Dette virker selvfølgelig kun på serveren, så sørg for, at din metode er i server-kun kode (helst i server undermappe eller inde i en if (Meteor.isServer) ).