Ab Meteor v1.0.4:
Sie können also collection.rawCollection()
aufrufen um das zugrunde liegende Sammlungsobjekt zu erhalten:
var rawCollection = Orders.rawCollection();
Diese rawCollection
hat eine Methode group
was der group
entspricht -Methode in der MongoDB-Shell. Die zugrunde liegende Node-API ist jedoch asynchron, daher sollten Sie sie irgendwie in eine synchrone Funktion konvertieren. Wir können Meteor.wrapAsync
nicht verwenden direkt seit group
nimmt Funktionsargumente, die nicht der primäre Callback sind, also werden wir dies mit einem Wrapper umgehen:
function ordersGroup(/* arguments */) {
var args = _.toArray(arguments);
return Meteor.wrapAsync(function (callback) {
rawCollection.group.apply(rawCollection, args.concat([callback]));
})();
}
Innerhalb Ihrer Methode können Sie ordersGroup
aufrufen wie Sie es mit db.orders.group
tun würden in der Mongo-Muschel. Die Argumente werden jedoch separat übergeben und nicht in einem Objekt:
ordersGroup(keys, condition, initial, reduce[, finalize[, command[, options]]])
Weitere Informationen finden Sie in dieser Dokumentation
(beachten Sie jedoch, dass der callback
Parameter sollte weggelassen werden, da unser Async-Wrapping sich darum kümmert).
Sie müssen sie also separat übergeben:
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);
}
);
Dies funktioniert natürlich nur auf dem Server, stellen Sie also sicher, dass sich Ihre Methode in Nur-Server-Code befindet (vorzugsweise im server
Unterverzeichnis oder innerhalb eines if (Meteor.isServer)
).