MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Grupa MongoDB i suma z identyfikatorem jako kluczem

Dzięki MongoDb 3.6 i nowszym możesz wykorzystać $arrayToObject operator i $replaceRoot potok, aby uzyskać pożądany wynik. Musisz uruchomić następujący zbiorczy potok:

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

W starszych wersjach $cond operator w $group krok potoku można skutecznie wykorzystać do oceny liczebności na podstawie wartości pola roli. Ogólny potok agregacji można skonstruować w następujący sposób, aby uzyskać wynik w żądanym formacie:

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"
        }
    }
])

Ze ścieżki komentarzy, jeśli nie znasz wcześniej ról i chcesz dynamicznie utworzyć tablicę potoku, uruchom distinct polecenie w polu roli. W ten sposób otrzymasz obiekt zawierający listę różnych ról:

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

Teraz, biorąc pod uwagę powyższą listę, możesz złożyć swój potok, tworząc obiekt, który będzie miał swoje właściwości ustawione za pomocą reduce() JavaScript metoda. Pokazuje to:

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 );

Użyj tych dwóch dokumentów w końcowym potoku agregacji jako:

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

Sprawdź demo poniżej.

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. Czy framework Mongodb Aggregation jest szybszy niż map/reduce?

  2. Zaktualizuj pole o wartość innego pola w dokumencie

  3. Jak przekazać ObjectId z MongoDB w MVC.net?

  4. MongoDB:wypisz „id” zamiast „_id”

  5. Pierwsze kroki ze sterownikiem MongoDB Go