A partir de Meteor v1.0.4:
Entonces puedes llamar a collection.rawCollection()
para obtener el objeto de colección subyacente:
var rawCollection = Orders.rawCollection();
Esta rawCollection
tiene un método group
que es equivalente al group
método en el shell de MongoDB. Sin embargo, la API del nodo subyacente es asíncrona, por lo que querrá convertirla en una función síncrona de alguna manera. No podemos usar Meteor.wrapAsync
directamente desde group
toma argumentos de función que no son la devolución de llamada principal, por lo que solucionaremos esto con un contenedor:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Dentro de su método, puede llamar a ordersGroup
como lo harías db.orders.group
en el caparazón de Mongo. Sin embargo, los argumentos se pasan por separado, en lugar de en un objeto:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Para obtener más información, consulte esta documentación
(aunque tenga en cuenta que la callback
el parámetro debe omitirse, ya que nuestro ajuste asíncrono se encarga de eso).
Así que tendrás que pasarlos por separado:
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);
}
);
Por supuesto, esto solo funciona en el servidor, así que asegúrese de que su método esté en código de solo servidor (preferiblemente en el server
subdirectorio, o dentro de un if (Meteor.isServer)
).