Depuis Meteor v1.0.4 :
Vous pouvez donc appeler collection.rawCollection()
pour obtenir l'objet de collection sous-jacent :
var rawCollection = Orders.rawCollection();
Cette rawCollection
a une méthode group
qui équivaut au group
méthode dans le shell MongoDB. L'API de nœud sous-jacente est cependant asynchrone, vous voudrez donc la convertir en une fonction synchrone d'une manière ou d'une autre. Nous ne pouvons pas utiliser Meteor.wrapAsync
directement depuis le group
prend des arguments de fonction qui ne sont pas le rappel principal, nous allons donc contourner cela avec un wrapper :
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Dans votre méthode, vous pouvez appeler ordersGroup
comme vous le feriez db.orders.group
dans la coquille Mongo. Cependant, les arguments sont passés séparément, plutôt que dans un objet :
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Pour plus d'informations, consultez cette documentation
(bien que notez que le callback
paramètre doit être omis, car notre emballage asynchrone s'en charge).
Vous devrez donc les transmettre séparément :
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);
}
);
Bien sûr, cela ne fonctionne que sur le serveur, alors assurez-vous que votre méthode est en code serveur uniquement (de préférence dans le server
sous-répertoire, ou à l'intérieur d'un if (Meteor.isServer)
).