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

Comptage d'agrégation d'objets imbriqués MongoDB

Vous devez traiter $unwind lorsque vous travaillez avec des tableaux, et vous devez le faire trois fois :

 db.collection.aggregate([

     // Un-wind the array's to access filtering 
     { "$unwind": "$studies" },
     { "$unwind": "$studies.samples" },
     { "$unwind": "$studies.samples.formdata" },

     // Group results to obtain the matched count per key
     { "$group": {
         "_id": "$studies.samples.formdata.GT",
         "count": { "$sum": 1 }
     }}
 ])

Idéalement, vous souhaitez filtrer votre entrée. Faites-le éventuellement avec un $match à la fois avant et après le traitement de $unwind et en utilisant un $regex pour faire correspondre les documents où les données au point commencent par un "1".

 db.collection.aggregate([

     // Match first to exclude documents where this is not present in any array member
     { "$match": { "studies.samples.formdata.GT": /^1/ } },

     // Un-wind the array's to access filtering 
     { "$unwind": "$studies" },
     { "$unwind": "$studies.samples" },
     { "$unwind": "$studies.samples.formdata" },

     // Match to filter
     { "$match": { "studies.samples.formdata.GT": /^1/ } },

     // Group results to obtain the matched count per key
     { "$group": {
         "_id": {
              "_id": "$_id",
              "key": "$studies.samples.formdata.GT"
         },
         "count": { "$sum": 1 }
     }}
 ])

Notez que dans tous les cas, les entrées préfixées "dollar $" sont les "variables" faisant référence aux propriétés du document. Ce sont des "valeurs" pour utiliser une entrée sur le côté droit. Les "clés" du côté gauche doivent être spécifiées comme une clé de chaîne simple. Aucune variable ne peut être utilisée pour nommer une clé.