Pada Meteor 0.6.5, API koleksi belum mendukung kueri agregasi karena tidak ada cara (langsung) untuk melakukan pembaruan langsung pada mereka. Namun, Anda tetap dapat menulisnya sendiri, dan membuatnya tersedia di Meteor.publish
, meskipun hasilnya akan statis. Menurut pendapat saya, melakukannya dengan cara ini masih lebih disukai karena Anda dapat menggabungkan beberapa agregasi dan menggunakan API pengumpulan sisi klien.
Meteor.publish("someAggregation", function (args) {
var sub = this;
// This works for Meteor 0.6.5
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
// Your arguments to Mongo's aggregation. Make these however you want.
var pipeline = [
{ $match: doSomethingWith(args) },
{ $group: {
_id: whatWeAreGroupingWith(args),
count: { $sum: 1 }
}}
];
db.collection("server_collection_name").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("client_collection_name", Random.id(), {
key: e._id.somethingOfInterest,
count: e.count
});
});
sub.ready();
},
function(error) {
Meteor._debug( "Error doing aggregation: " + error);
}
)
);
});
Di atas adalah contoh pengelompokan/jumlah agregasi. Beberapa hal yang perlu diperhatikan:
- Saat Anda melakukan ini, Anda secara alami akan melakukan agregasi pada
server_collection_name
dan mendorong hasilnya ke koleksi lain yang disebutclient_collection_name
. - Langganan ini tidak akan ditayangkan, dan mungkin akan diperbarui setiap kali argumen berubah, jadi kami menggunakan loop yang sangat sederhana yang hanya mendorong semua hasil.
- Hasil agregasi tidak memiliki ObjectIDs Mongo, jadi kami membuat beberapa yang arbitrer sendiri.
- Panggilan balik ke agregasi harus dibungkus dengan Fiber. Saya menggunakan
Meteor.bindEnvironment
di sini tetapi seseorang juga dapat menggunakanFuture
untuk kontrol tingkat rendah lainnya.
Jika Anda mulai menggabungkan hasil publikasi seperti ini, Anda harus mempertimbangkan dengan cermat bagaimana id yang dibuat secara acak memengaruhi kotak gabungan. Namun, implementasi langsung dari ini hanyalah kueri basis data standar, kecuali lebih nyaman digunakan dengan sisi klien Meteor API.
TL;versi DR :Hampir setiap kali Anda mendorong data keluar dari server, sebuah publish
lebih disukai daripada method
.
Untuk informasi selengkapnya tentang berbagai cara melakukan agregasi, lihat pos ini .