2017-10-03 2 views
0

J'ai Collections attributions, états, Cessionnaire.MongoDB Groupe compte par occurences de valeurs et de sortie comme nouveau champ

Missions Domaines: [_id, statut Assigné]

Assigné et Etat Domaines: [_id, le nom].

Il peut y avoir de nombreuses missions associées à divers Statut et Assigné collections (liés via _id champ), Il n'y a pas d'imbrication ou des données complexes.

je besoin d'une requête pour toutes les affectations idscessionnaires sont la ligne, Statut sont les colonnes, il est combiné cellulaire avec les counttotal compte à la fin.

Pour vous aider à visualiser, je joins l'image ci-dessous. Je suis nouveau à complexe Mongo DB Aggregate complexe, veuillez me guider pour obtenir une requête.

Remarque: Les données dans Statut et collection Assigné sera dynamique. Rien n'est prédéterminé dans la requête. Ainsi, les lignes et les colonnes vont se développer dynamiquement à l'avenir, si la requête est donnée pagination, alors il serait d'une grande aide. Je ne peux pas écrire une requête avec des noms codés en dur status comme 'pending', 'completed' etc. Comme les données doivent augmenter et les données existantes peuvent changer comme 'pending task', 'completed work'.

enter image description here

est Ci-dessous ma requête

db.getCollection('Assignments').aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "assignee": "$assignee", 
       "statusId": "$statusId" 
      }, 
      "statusCount": { "$sum": 1 } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id.assignee", 
      "statuses": { 
       "$push": { 
        "statusId": "$_id.statusId", 
        "count": "$statusCount" 
       }, 
      }, 
      "count": { "$sum": "$statusCount" } 
     } 
    }, 
    ]); 

Ci-dessous le format de sortie:

{ 
    "_id" : "John", 
    "statuses" : { 
     "statusId" : "Pending", 
     "count" : 3.0 
    }, 
    "count" : 3.0 
} 
{ 
    "_id" : "Katrina", 
    "statuses" : [{ 
     "statusId" : "Pending", 
     "count" : 1.0 
    }, 
    { 
     "statusId" : "Completed", 
     "count" : 1.0 
    }, 
    { 
     "statusId" : "Assigned", 
     "count" : 1.0 
    }], 
    "count" : 3.0 
} 
{ 
    "_id" : "Collins", 
    "statuses" : { 
     "statusId" : "Pending", 
     "count" : 4.0 
    }, 
    "count" : 4.0 
} 

Résultat attendu est:

{ 
    "_id" : "Katrina", 
    "Pending" : 1.0, 
    "Completed" : 1.0, 
    "Assigned" : 1.0, 
    "totalCount" : 3.0 
} 

Toute idée sur la façon de nombreux différents statusId pour différents assignee comme des clés et non des valeurs dans un seul document.

Répondre

0

Vous avez besoin après une autre étape $group$unwind à compter le nombre d'état en fonction de la valeur de chaîne StatusID:

{ 
    "$group": { 
     "_id": "$_id", 
     "Pending" : { 
      "$sum": { 
       "$cond": [ 
        { "$eq": [ 
         "$statuses.statusId", 
         "Pending" 
        ]}, 
       "$statuses.count", 
       0 
       ] 
      } 
     }, 
     "Completed" : { 
      "$sum": { 
       "$cond": [ 
        { "$eq": [ 
         "$statuses.statusId", 
         "Completed" 
        ]}, 
       "$statuses.count", 
       0 
       ] 
      } 
     }, 
     "Assigned" : { 
      "$sum": { 
       "$cond": [ 
        { "$eq": [ 
         "$statuses.statusId", 
         "Assigned" 
        ]}, 
       "$statuses.count", 
       0 
       ] 
      } 
     }, 
     "totalCount": { "$sum": 1 } 
    } 
} 

La commande globale finale:

db.getCollection('Assignments').aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "assignee": "$assignee", 
       "statusId": "$statusId" 
      }, 
      "statusCount": { "$sum": 1 } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id.assignee", 
      "statuses": { 
       "$push": { 
        "statusId": "$_id.statusId", 
        "count": "$statusCount" 
       }, 
      }, 
      "count": { "$sum": "$statusCount" } 
     } 
    }, 
    { "$unwind": "$statuses" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "Pending" : { 
       "$sum": { 
        "$cond": [ 
         { "$eq": [ 
          "$statuses.statusId", 
          "Pending" 
         ]}, 
        "$statuses.count", 
        0 
        ] 
       } 
      }, 
      "Completed" : { 
       "$sum": { 
        "$cond": [ 
         { "$eq": [ 
          "$statuses.statusId", 
          "Completed" 
         ]}, 
        "$statuses.count", 
        0 
        ] 
       } 
      }, 
      "Assigned" : { 
       "$sum": { 
        "$cond": [ 
         { "$eq": [ 
          "$statuses.statusId", 
          "Assigned" 
         ]}, 
        "$statuses.count", 
        0 
        ] 
       } 
      }, 
      "totalCount": { "$sum": 1 } 
     } 
    } 
]); 
+0

Merci beaucoup. J'apprécie votre temps pour ma question. Mais vous avez codé en dur les valeurs 'status'. J'ai mentionné dans la question que les valeurs 'status' et' assignataire' vont augmenter dans le futur. La requête ci-dessus n'est donc pas adaptée au contenu croissant de manière dynamique. –