Има обща настройка, която можете да използвате за достъп до основния обект за събиране на драйвери и следователно .aggregate()
без да инсталирате други добавки.
Основният процес протича по следния начин:
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);
}
)
);
});
Така че дефинирате колекция за изхода на агрегирането и в рамките на рутина като тази след това публикувате услугата, за която също ще се абонирате във вашия клиент.
Вътре в това агрегацията се изпълнява и попълва в другата колекция (логично, тъй като всъщност не пише нищо). Така че след това използвате тази колекция на клиента със същата дефиниция и всички обобщени резултати просто се връщат.
Всъщност имам пълно работещо примерно приложение на подобен процес в този въпрос , както и използването на aggregate meteor hacks пакет на този въпрос тук също, ако имате нужда от допълнителна справка.