MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zählung der Aggregation verschachtelter MongoDB-Objekte

Sie müssen $unwind verarbeiten beim Arbeiten mit Arrays, und Sie müssen dies dreimal tun:

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

Idealerweise möchten Sie Ihre Eingaben filtern. Tun Sie dies möglicherweise mit einem $match sowohl vor als auch nach der Verarbeitung von $unwind und unter Verwendung einer $regex/">$regex zum Abgleichen von Dokumenten, bei denen die Daten am Punkt mit einer "1" beginnen.

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

Beachten Sie, dass in allen Fällen die Einträge mit dem Präfix "Dollar $" die "Variablen" sind, die sich auf die Eigenschaften des Dokuments beziehen. Dies sind "Werte", um eine Eingabe auf der rechten Seite zu verwenden. Die "Schlüssel" auf der linken Seite müssen als einfacher Zeichenfolgenschlüssel angegeben werden. Es kann keine Variable verwendet werden, um einen Schlüssel zu benennen.