Il existe une configuration générale que vous pouvez utiliser pour accéder à l'objet de collection de pilotes sous-jacent et donc .aggregate()
sans installer d'autres plugins.
Le processus de base se déroule comme suit :
FooAges = new Meteor.Collection("fooAges");
Meteor.publish("fooAgeQuery", function(args) {
var sub = this;
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
var pipeline = [
{ "$group": {
"_id": "$age",
"name": { "$max": "$name" }
}}
];
db.collection("foo").aggregate(
pipeline,
// Need to wrap the callback so it gets called in a Fiber.
Meteor.bindEnvironment(
function(err, result) {
// Add each of the results to the subscription.
_.each(result, function(e) {
// Generate a random disposable id for aggregated documents
sub.added("fooAges", Random.id(), {
"age": e._id,
"name": e.name
});
});
sub.ready();
},
function(error) {
Meteor._debug( "Error doing aggregation: " + error);
}
)
);
});
Vous définissez donc une collection pour la sortie de l'agrégation et dans une routine comme celle-ci, vous publiez ensuite le service auquel vous allez également vous abonner dans votre client.
À l'intérieur de celui-ci, l'agrégation est exécutée et remplie dans l'autre collection (logiquement car elle n'écrit rien). Donc, vous utilisez ensuite cette collection sur le client avec la même définition et tous les résultats agrégés sont simplement renvoyés.
J'ai en fait un exemple complet d'application d'un processus similaire dans cette question , ainsi que l'utilisation de l'agrégat de hacks météores package sur cette question ici aussi, si vous avez besoin de plus amples références.