Sangat mungkin jika menggunakan MongoDB 3.6 dan yang lebih baru melalui kerangka kerja agregasi. Gunakan $objectToArray
operator dalam pipa agregasi untuk mengonversi dokumen menjadi array. Array kembali berisi elemen untuk setiap pasangan bidang/nilai dalam dokumen asli. Setiap elemen dalam larik kembali adalah dokumen yang berisi dua bidang k
dan v
.
Referensi untuk me-root dokumen dimungkinkan melalui $$ROOT
variabel sistem yang mereferensikan dokumen tingkat atas yang saat ini sedang diproses dalam tahap alur agregasi.
Saat mendapatkan array, Anda kemudian dapat memanfaatkan penggunaan $addFields
langkah pipa untuk membuat bidang yang menampung jumlah dan jumlah sebenarnya diturunkan dengan menggunakan $size
operator.
Semua ini dapat dilakukan dalam satu saluran dengan menyarangkan ekspresi sebagai berikut:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
Contoh Keluaran
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
Untuk mengecualikan _id
bidang, Anda dapat menggunakan $filter
operator sebagai:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
atau seperti yang disarankan oleh 0zkr PM cukup tambahkan $project
langkah pipa di awal:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])