MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Grup MongoDB dan jumlahkan dengan id sebagai kunci

Dengan MongoDb 3.6 dan yang lebih baru, Anda dapat memanfaatkan penggunaan $arrayToObject operator dan $replaceRoot pipa untuk mendapatkan hasil yang diinginkan. Anda perlu menjalankan pipa agregat berikut:

db.users.aggregate([
    { 
        "$group": {
            "_id": { "$toLower": "$role" },
            "count": { "$sum": 1 }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "k": "$_id",
                    "v": "$count"
                }
            }
        }
    },
    { 
        "$replaceRoot": {
            "newRoot": { "$arrayToObject": "$counts" }
        } 
    }    
])

Untuk versi yang lebih lama, $cond operator di $group langkah pipa dapat digunakan secara efektif untuk mengevaluasi jumlah berdasarkan nilai bidang peran. Pipa agregasi keseluruhan Anda dapat dibangun sebagai berikut untuk menghasilkan hasil dalam format yang diinginkan:

db.users.aggregate([    
    { 
        "$group": { 
            "_id": null,             
            "moderator_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$role", "moderator" ] }, 1, 0 ]
                }
            },
            "superadmin_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$role", "superadmin" ] }, 1, 0 ]
                }
            },
            "user_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$role", "user" ] }, 1, 0 ]
                }
            },
            "admin_count": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$role", "admin" ] }, 1, 0 ]
                }
            } 
        }  
    },
    {
        "$project": {
            "_id": 0, 
            "moderator": "$moderator_count",
            "superadmin": "$superadmin_count",
            "user": "$user_count",
            "admin": "$admin_count"
        }
    }
])

Dari jejak komentar, jika Anda tidak mengetahui role sebelumnya dan ingin membuat array pipeline secara dinamis, jalankan distinct perintah di bidang peran. Ini akan memberi Anda objek yang berisi daftar peran yang berbeda:

var result = db.runCommand ( { distinct: "users", key: "role" } )
var roles = result.values;
printjson(roles); // this will print ["moderator", "superadmin", "user",  "admin"]

Sekarang dengan daftar di atas, Anda dapat merakit saluran Anda dengan membuat objek yang propertinya akan disetel menggunakan reduce() JavaScript metode. Berikut ini menunjukkan hal ini:

var groupObj = { "_id": null },
    projectObj = { "_id": 0 }

var groupPipeline = roles.reduce(function(obj, role) { // set the group pipeline object 
    obj[role + "_count"] = {
        "$sum": {
            "$cond": [ { "$eq": [ "$role", role ] }, 1, 0 ]
        }
    };
    return obj;
}, groupObj );

var projectPipeline = roles.reduce(function(obj, role) { // set the project pipeline object 
    obj[role] = "$" + role + "_count";
    return obj;
}, projectObj );

Gunakan dua dokumen ini dalam alur agregasi akhir Anda sebagai:

db.users.aggregate([groupPipeline, projectPipeline]);

Periksa demo di bawah ini.

var roles = ["moderator", "superadmin", "user",  "admin"],
	groupObj = { "_id": null },
	projectObj = { "_id": 0 };

var groupPipeline = roles.reduce(function(obj, role) { // set the group pipeline object 
	obj[role + "_count"] = {
		"$sum": {
			"$cond": [ { "$eq": [ "$role", role ] }, 1, 0 ]
		}
	};
	return obj;
}, groupObj );

var projectPipeline = roles.reduce(function(obj, role) { // set the project pipeline object 
	obj[role] = "$" + role + "_count";
	return obj;
}, projectObj );

var pipeline = [groupPipeline, projectPipeline]

pre.innerHTML = JSON.stringify(pipeline, null, 4);
<pre id="pre"></pre>


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bisakah kerangka agregasi MongoDB $group mengembalikan array nilai?

  2. Cara Mengelola Template Konfigurasi untuk Database Anda Dengan ClusterControl

  3. Menggunakan MongoDB $pull untuk menghapus dokumen dalam Array

  4. Bagaimana cara menggunakan penyisipan massal yang tidak berurutan dengan Mongoskin?

  5. PyMongo upsert melempar upsert harus menjadi contoh kesalahan bool