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