Vanaf Meteor v1.0.4:
U kunt dus collection.rawCollection()
. aanroepen om het onderliggende collectieobject te krijgen:
var rawCollection = Orders.rawCollection();
Deze rawCollection
heeft een methode group
wat gelijk is aan de group
methode in de MongoDB-shell. De onderliggende knooppunt-API is echter asynchroon, dus u zult deze op de een of andere manier naar een synchrone functie willen converteren. We kunnen Meteor.wrapAsync
niet gebruiken rechtstreeks vanaf group
neemt functieargumenten die niet de primaire callback zijn, dus we zullen dit omzeilen met een wrapper:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Binnen uw methode kunt u ordersGroup
. aanroepen zoals je zou doen db.orders.group
in de Mongo-schelp. De argumenten worden echter afzonderlijk doorgegeven, in plaats van in een object:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Zie deze documentatie
voor meer informatie. (houd er echter rekening mee dat de callback
parameter moet worden weggelaten, omdat onze async-wrapping daarvoor zorgt).
Je moet ze dus apart inleveren:
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);
}
);
Dit werkt natuurlijk alleen op de server, dus zorg ervoor dat je methode in server-only code staat (bij voorkeur in de server
submap, of in een if (Meteor.isServer)
).