A partire da Meteor v1.0.4:
Quindi puoi chiamare collection.rawCollection()
per ottenere l'oggetto raccolta sottostante:
var rawCollection = Orders.rawCollection();
Questa rawCollection
ha un metodo group
che è equivalente al group
metodo nella shell MongoDB. Tuttavia, l'API del nodo sottostante è asincrona, quindi ti consigliamo di convertirla in una funzione sincrona in qualche modo. Non possiamo usare Meteor.wrapAsync
direttamente dal group
accetta argomenti di funzione che non sono il callback principale, quindi lavoreremo con un wrapper:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
All'interno del tuo metodo, puoi chiamare ordersGroup
come faresti con db.orders.group
nella conchiglia Mongo. Tuttavia, gli argomenti vengono passati separatamente, anziché in un oggetto:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Per ulteriori informazioni, consulta questa documentazione
(sebbene si noti che il callback
parametro dovrebbe essere omesso, poiché il nostro async-wrapping si occupa di questo).
Quindi dovrai passarli separatamente:
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);
}
);
Ovviamente funziona solo sul server, quindi assicurati che il tuo metodo sia in codice solo server (preferibilmente nel server
sottodirectory o all'interno di un if (Meteor.isServer)
).