Ada pengaturan umum yang dapat Anda gunakan untuk mengakses objek koleksi driver yang mendasarinya dan karenanya .aggregate()
tanpa menginstal plugin lain.
Proses dasarnya seperti ini:
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);
}
)
);
});
Jadi, Anda menentukan koleksi untuk output agregasi dan dalam rutinitas seperti ini, Anda kemudian mempublikasikan layanan yang juga akan Anda langgani di klien Anda.
Di dalam ini, agregasi dijalankan dan diisi ke dalam koleksi lain (secara logis karena tidak benar-benar menulis apa pun). Jadi Anda kemudian menggunakan koleksi itu pada klien dengan definisi yang sama dan semua hasil gabungan baru saja dikembalikan.
Saya sebenarnya memiliki aplikasi contoh kerja lengkap dari proses serupa dalam pertanyaan ini , serta penggunaan agregat peretasan meteor paket pada pertanyaan ini di sini juga, jika Anda membutuhkan referensi lebih lanjut.