MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment compter plusieurs clés dans la même requête $group d'agrégation MongoDB ?

Il existe plusieurs approches différentes que vous pouvez utiliser ici :

  1. Utilisez map/reduce :ne le faites pas. À l'heure actuelle, il serait beaucoup plus rapide d'exécuter le cadre d'agrégation 3 fois que d'utiliser une fonction de réduction de carte pour ce cas d'utilisation.

  2. Exécutez l'agrégation 3 fois. Ce n'est pas optimal, mais si vous n'avez pas de contraintes de temps, c'est l'option la plus simple. Si vos agrégations prennent

  3. Voici la meilleure solution de contournement à laquelle je puisse penser. Le $group permet de construire un _id sur plusieurs terrains. Par exemple. {"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}} . Cela crée un regroupement pour toutes les combinaisons existantes de vos différentes touches. Vous pouvez éventuellement regrouper vos clés de cette manière, puis additionner manuellement les résultats dans le client.

Laissez-moi élaborer. Disons que nous avons une collection de formes. Ces formes peuvent avoir une couleur, une taille et un type (carré, cercle, etc.). Une agrégation sur un identifiant multi-clé pourrait ressembler à :

db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})

et retour :

"result" : [
        {
            "_id" : {
                "f1" : "yellow",
                "f2" : "medium",
                "f3" : "triangle"
            },
            "count" : 4086
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "small",
                "f3" : "triangle"
            },
            "count" : 4138
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "big",
                "f3" : "square"
            },
            "count" : 4113
        },
        {
            "_id" : {
                "f1" : "yellow",
                "f2" : "small",
                "f3" : "triangle"
            },
            "count" : 4145
        },
        {
            "_id" : {
                "f1" : "red",
                "f2" : "small",
                "f3" : "square"
            },
            "count" : 4062
        }

... et ainsi de suite

Vous résumeriez ensuite les résultats côté client, sur un nombre d'entrées considérablement réduit. En supposant que le nombre de valeurs uniques pour chaque clé est suffisamment petit par rapport au nombre total de documents, vous pourriez effectuer cette dernière étape en un temps négligeable.