Der er en generel opsætning, du kan bruge til at få adgang til det underliggende driverindsamlingsobjekt og derfor .aggregate()
uden at installere andre plugins.
Den grundlæggende proces går sådan her:
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);
}
)
);
});
Så du definerer en samling for output fra aggregeringen, og inden for en rutine som denne udgiver du så den service, som du også vil abonnere på i din klient.
Inde i denne køres aggregeringen og udfyldes i den anden samling (logisk, da den faktisk ikke skriver noget). Så du bruger den samling på klienten med den samme definition, og alle de samlede resultater returneres bare.
Jeg har faktisk et fuldt fungerende eksempel på anvendelse af en lignende proces i dette spørgsmål , samt brug af meteor hacks-aggregatet pakke på dette spørgsmål også her, hvis du har brug for yderligere reference.