Det finns en allmän inställning som du kan använda för att komma åt det underliggande drivrutinsamlingsobjektet och därför .aggregate()
utan att installera några andra plugins.
Den grundläggande processen går till så här:
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 definierar en samling för utdata från aggregeringen och inom en rutin som denna publicerar du sedan tjänsten som du också ska prenumerera på i din klient.
Inuti denna körs aggregeringen och fylls i den andra samlingen (logiskt eftersom det faktiskt inte skriver någonting). Så du använder sedan den samlingen på klienten med samma definition och alla aggregerade resultat returneras bara.
Jag har faktiskt ett fullständigt fungerande exempel på en liknande process inom denna fråga , samt användning av aggregatet för meteorhack paket på denna fråga här också, om du behöver ytterligare referens.