MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Contagem de agregação de objetos aninhados do MongoDB


Você precisa processar $unwind ao trabalhar com arrays, e você precisa fazer isso três vezes:
 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, você deseja filtrar sua entrada. Possivelmente faça isso com um $match antes e depois de $unwind ser processado e usando um $regex para corresponder documentos onde os dados no ponto começam com um "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 }
     }}
 ])

Observe que em todos os casos as entradas prefixadas "dólar $" são as "variáveis" referentes às propriedades do documento. Estes são "valores" para usar uma entrada no lado direito. As "chaves" do lado esquerdo devem ser especificadas como uma chave de string simples. Nenhuma variável pode ser usada para nomear uma chave.