A partir do Meteor v1.0.4:
Então você pode chamar
collection.rawCollection()
para obter o objeto de coleção subjacente:var rawCollection = Orders.rawCollection();
Esta
rawCollection
tem um método group
que é equivalente ao group
método no shell do MongoDB. A API do nó subjacente é assíncrona, portanto, você desejará convertê-la em uma função síncrona de alguma forma. Não podemos usar Meteor.wrapAsync
diretamente desde group
recebe argumentos de função que não são o retorno de chamada principal, então vamos contornar isso com um wrapper:function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Dentro do seu método, você pode chamar
ordersGroup
como você faria db.orders.group
na concha do Mongo. No entanto, os argumentos são passados separadamente, em vez de em um objeto:ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Para obter mais informações, consulte esta documentação (embora observe que o
callback
O parâmetro deve ser deixado de fora, pois nosso encapsulamento assíncrono cuida disso). Então você terá que passá-los separadamente:
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);
}
);
Claro, isso só funciona no servidor, portanto, certifique-se de que seu método esteja no código somente do servidor (de preferência no
server
subdiretório, ou dentro de um if (Meteor.isServer)
).