Er is een algemene instelling die u kunt gebruiken om toegang te krijgen tot het onderliggende stuurprogrammaverzamelingsobject en daarom .aggregate()
zonder andere plug-ins te installeren.
Het basisproces gaat als volgt:
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);
}
)
);
});
Dus je definieert een collectie voor de output van de aggregatie en binnen een routine als deze publiceer je vervolgens de service waarop je je ook gaat abonneren in je client.
Hierbinnen wordt de aggregatie uitgevoerd en ingevuld in de andere verzameling (logisch omdat het eigenlijk niets schrijft). Dus je gebruikt dan die verzameling op de client met dezelfde definitie en alle geaggregeerde resultaten worden gewoon geretourneerd.
Ik heb eigenlijk een volledig werkende voorbeeldtoepassing van een vergelijkbaar proces binnen deze vraag , evenals het gebruik van de meteor hacks-aggregaat pakket op deze vraag hier ook, als u meer informatie nodig heeft.