Jika Anda menggunakan agregat peretasan meteor
paket untuk mengimplementasikan .aggregate()
perintah pada koleksi Anda, maka itu hanya akan mengembalikan array sebagai tanggapan. Jadi, Anda perlu mengolahnya menjadi bentuk koleksi yang diterbitkan:
Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});
Atau untuk menyertakan false
dihitung seperti yang disarankan oleh output yang Anda sarankan:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Sebagai saluran dengan $cond
evaluasi untuk mengkonversi ke numerik.
Di mana dalam agregasi dasar Anda hanya "menjumlahkan" hasil yang cocok dan tentu saja $sort
merujuk ke bidang yang ada di output, yang dengan contoh Anda akan menjadi nilai "userId" sekarang di _id
kunci dari agregasi, tetapi juga bisa "dihitung" untuk dipesan dengan jumlah total jika diinginkan.
Bagian itu menghasilkan kesalahan, sebagai $sort
adalah bidang sekarang dan bukan nilai bidang dengan $
notasi.
Tetapi tentu saja untuk menerbitkan sebagai koleksi yang dapat diakses klien, Anda perlu mengganti _id
actual yang sebenarnya dengan sesuatu yang diharapkan. Jadi pembuatan id acak berfungsi di sini, seperti halnya penyertaan bidang lainnya.
Untuk sedikit lebih detail, dan juga alternatif untuk paket "peretasan" yang hanya berfungsi dengan instalasi vanilla, ada juga jawaban ini sendiri yang memiliki daftar lengkap sebagai contoh.