sql >> Base de Datos >  >> NoSQL >> MongoDB

Recuento de agregación de objetos anidados de MongoDB

Debe procesar $unwind cuando trabaja con arreglos, y necesita hacer esto tres veces:

 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, desea filtrar su entrada. Posiblemente haga esto con un $match tanto antes como después de que se procese $unwind y usando un $regex para hacer coincidir los documentos donde los datos en el punto comienzan 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 }
     }}
 ])

Tenga en cuenta que en todos los casos las entradas con el prefijo "dólar $" son las "variables" que se refieren a las propiedades del documento. Estos son "valores" para usar una entrada en el lado derecho. Las "teclas" del lado izquierdo deben especificarse como una clave de cadena simple. No se puede usar ninguna variable para nombrar una clave.