Från och med Meteor v1.0.4:
Så du kan anropa collection.rawCollection()
för att hämta det underliggande samlingsobjektet:
var rawCollection = Orders.rawCollection();
Denna rawCollection
har en metod group
vilket motsvarar group
metod i MongoDB-skalet. Det underliggande nod-APIet är dock asynkront, så du vill konvertera det till en synkron funktion på något sätt. Vi kan inte använda Meteor.wrapAsync
direkt från group
tar funktionsargument som inte är den primära återuppringningen, så vi löser detta med ett omslag:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Inuti din metod kan du anropa ordersGroup
som du skulle db.orders.group
i Mongo-skalet. Men argumenten skickas separat, snarare än i ett objekt:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
För mer information, se denna dokumentation
(men observera att callback
parametern bör utelämnas, eftersom vår asynkron-inpackning tar hand om det).
Så du måste skicka in 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);
}
);
Naturligtvis fungerar detta bara på servern, så se till att din metod är i endast serverkod (helst i server
underkatalog, eller i en if (Meteor.isServer)
).