Bukannya saya pikir itu ide yang bagus dan sebagian besar karena saya tidak melihat "agregasi" di sini sama sekali adalah bahwa setelah "mengelompokkan" untuk menambahkan ke array Anda juga $push
semua konten itu ke dalam array dengan "status"
mengelompokkan kunci dan kemudian mengubahnya menjadi kunci dokumen dalam $replaceRoot
dengan $arrayToObject
:
db.collection.aggregate([
{ "$group": {
"_id": "$status",
"data": { "$push": "$$ROOT" }
}},
{ "$group": {
"_id": null,
"data": {
"$push": {
"k": "$_id",
"v": "$data"
}
}
}},
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$data" }
}}
])
Pengembalian:
{
"inProgress" : [
{
"_id" : ObjectId("5b18d31a27a37696ec8b5776"),
"status" : "inProgress",
"description" : "inProgress..."
}
],
"completed" : [
{
"_id" : ObjectId("5b18d31a27a37696ec8b5773"),
"status" : "completed",
"description" : "completed..."
}
],
"pending" : [
{
"_id" : ObjectId("5b18d14cbc83fd271b6a157c"),
"status" : "pending",
"description" : "You have to complete the challenge..."
},
{
"_id" : ObjectId("5b18d31a27a37696ec8b5775"),
"status" : "pending",
"description" : "pending..."
}
]
}
Itu mungkin baik-baik saja JIKA Anda sebenarnya "menggabungkan" sebelumnya, tetapi pada koleksi berukuran praktis apa pun yang dilakukan adalah mencoba memaksa seluruh koleksi menjadi satu dokumen, dan itu kemungkinan akan melanggar Batas BSON 16MB, jadi saya tidak akan merekomendasikan bahkan mencoba ini tanpa " pengelompokan" sesuatu yang lain sebelum langkah ini.
Terus terang, kode berikut yang sama melakukan hal yang sama, dan tanpa trik agregasi dan tidak ada masalah batas BSON:
var obj = {};
// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d => {
if (!obj.hasOwnProperty(d.status))
obj[d.status] = [];
obj[d.status].push(d);
})
printjson(obj);
Atau sedikit lebih pendek:
var obj = {};
// Using forEach as a premise for representing "any" cursor iteration form
db.collection.find().forEach(d =>
obj[d.status] = [
...(obj.hasOwnProperty(d.status)) ? obj[d.status] : [],
d
]
)
printjson(obj);
Agregasi digunakan untuk "reduksi data" dan apa pun yang sekadar "membentuk kembali hasil" tanpa benar-benar mengurangi data yang dikembalikan dari server biasanya lebih baik ditangani dalam kode klien. Anda masih mengembalikan semua data apa pun yang Anda lakukan, dan pemrosesan klien dari kursor memiliki overhead yang jauh lebih sedikit. Dan TANPA batasan.