MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Conteggio dell'aggregazione di oggetti nidificati MongoDB

Devi elaborare $unwind quando lavori con gli array e devi farlo tre volte:

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

Idealmente vuoi filtrare il tuo input. Forse farlo con un $match sia prima che dopo l'elaborazione di $unwind e utilizzando un $regex per abbinare i documenti in cui i dati al punto iniziano con 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 }
     }}
 ])

Si noti che in tutti i casi le voci con prefisso "dollaro $" sono le "variabili" che si riferiscono alle proprietà del documento. Questi sono "valori" per utilizzare un input sul lato destro. Le "chiavi" sul lato sinistro devono essere specificate come una semplice chiave stringa. Nessuna variabile può essere utilizzata per nominare una chiave.