2016-04-16 2 views
0

In diesem Code habe ich einen Arzt Dokument und in dem Dokument gibt es eine Reihe von Patienten des Arztes. In diesem Fall möchte ich herausfinden, das Durchschnittsalter aller Patienten in meinem Array.Wie könnte ich das tun?Wie kann ich den Durchschnittswert eines Werts in einem Array ermitteln?

{ 
      "_id" : ObjectId("57113238bde91693e9ff69e7"), 
      "docname" : "Arthur Hovsepyan", 
      "job_desc" : "Hepatologist", 
      "sex" : "male", 
      "jobtype" : "fulltime", 
      "office" : "room 448", 
      "email" : "[email protected]", 
      "phone_number" : 862124343, 
      "address" : "68 Peterburg street,waterford", 
      "hours" : 12, 
      "patients" : [ 
        { 
          "name" : "Jenny Power", 
          "ward_no" : 1, 
          "sex" : "female", 
          "termdays" : 2, 
          "illness_type" : "minor", 
          "age" : 22, 
          "phone_number" : 877285221, 
          "address" : "63 Johnston street ,Waterford" 
        }, 
        { 
          "name" : "Marie Peters", 
          "ward_no" : 2, 
          "sex" : "female", 
          "termdays" : 0, 
          "illness_type" : "minor", 
          "age" : 21, 
          "phone_number" : 862145992, 
          "address" : "99 Grange,Waterford" 
        }, 
        { 
          "name" : "Philip John", 
          "ward_no" : 2, 
          "sex" : "male", 
          "termdays" : 10, 
          "illness_type" : "serious", 
          "age" : 31, 
          "phone_number" : 861125981, 
          "address" : "12 Monvoy Bridge,Waterford" 
        }, 
        { 
          "name" : "Marta Peters", 
          "ward_no" : 3, 
          "sex" : "female", 
          "termd7ays" : 0, 
          "illness_type" : "minor", 
          "age" : 31, 
          "phone_number" : 862125981, 
          "address" : "100 Grange Manor,Waterford" 
        } 
      ] 
    } 

Antwort

0

Sie dies tun, können die .aggregate() Methode verwendet, den Zugriff auf die Aggregation Pipeline zur Verfügung stellt. Der optimale Weg dazu ist die Verwendung des Akkumulatoroperators $avg in der Stufe $project, wenn Sie MongoDB 3.2 oder neuer verwenden.

db.collection.aggregate([ 
    { "$project": { 
     "averageAge": { "$avg": "$patients.age" } 
    }} 
]) 

Von MongoDB 3.0 rückwärts benötigen Sie einen anderen Ansatz. Sie können zuerst Ihre Dokumente $project und eine Reihe von "Alter" Ihrer "Patienten" mit dem $map-Operator zurückgeben. Von dort müssen Sie dieses Array mit dem $unwind Operator dann $group Ihre Dokumente durch _id de-normalisieren und den Operator $avg verwenden, um den Durchschnitt von "Alter" zurückzugeben.

db.collection.aggregate([ 
    { "$project": { 
     "agePatients": { 
      "$map": { 
       "input": "$patients", 
       "as": "p", 
       "in": "$$p.age" 
      } 
     } 
    }}, 
    { "$unwind": "$agePatients" }, 
    { "$group": { 
     "_id": "$_id", 
     "averageAge": { "$avg": "$agePatients" } 
    }} 
]) 

Welche zurück:

{ 
    "_id" : ObjectId("57113238bde91693e9ff69e7"), 
    "averageAge" : 26.25 
} 
0

Für dieses Problem müssen Sie zuerst die interne Anordnung von Patienten entspannen und dann den $ avg Operator auf patients.age Attribut anwenden. Ihre Abfrage wäre: -

db. collection.aggregate([ 
    { 
    "$unwind": "$patients" 
    }, 
    { 
     $group : { 
       _id:{ 
         "docname" : "$docname" 
        }, 
       avg_age : {$avg : "$patients.age"} 
      } 

     } 
]) 
+0

, wenn ich versuche, dass ich einen Durchschnitt von Null erhalten – ebatinstitute

0

Wenn Sie MongoDB haben 3.2+, Sie $avg in $project Stufe verwenden kann, die weniger Belastung Ressourcen auf dem Server gestellt. Wenn Ihre MongoDB-Version jedoch kleiner als 3,2 ist, sollten Sie die von ashisahu veröffentlichte Lösung in Betracht ziehen.

db.collection.aggregate([ 
    { 
    $project:{ 
     docname: 1, 
     job_desc: 1, 
     sex: 1, 
     jobtype: 1, 
     office: 1, 
     email: 1, 
     phone_number: 1, 
     address: 1, 
     hours: 1, 
     patients: 1, 
     avg_age_of_patients:{$avg:"$patients.age"} 
    } 
    } 
]) 

Dies wird folgendes Dokument ausgeben. (Siehe avg_age_of_patients Feld)

{ 
    "_id" : ObjectId("57113238bde91693e9ff69e7"), 
    "docname" : "Arthur Hovsepyan", 
    "job_desc" : "Hepatologist", 
    "sex" : "male", 
    "jobtype" : "fulltime", 
    "office" : "room 448", 
    "email" : "[email protected]", 
    "phone_number" : 8.62124343E8, 
    "address" : "68 Peterburg street,waterford", 
    "hours" : 12.0, 
    "patients" : [ 
     { 
      "name" : "Jenny Power", 
      "ward_no" : 1.0, 
      "sex" : "female", 
      "termdays" : 2.0, 
      "illness_type" : "minor", 
      "age" : 22.0, 
      "phone_number" : 8.77285221E8, 
      "address" : "63 Johnston street ,Waterford" 
     }, 
     { 
      "name" : "Marie Peters", 
      "ward_no" : 2.0, 
      "sex" : "female", 
      "termdays" : 0.0, 
      "illness_type" : "minor", 
      "age" : 21.0, 
      "phone_number" : 8.62145992E8, 
      "address" : "99 Grange,Waterford" 
     }, 
     { 
      "name" : "Philip John", 
      "ward_no" : 2.0, 
      "sex" : "male", 
      "termdays" : 10.0, 
      "illness_type" : "serious", 
      "age" : 31.0, 
      "phone_number" : 8.61125981E8, 
      "address" : "12 Monvoy Bridge,Waterford" 
     }, 
     { 
      "name" : "Marta Peters", 
      "ward_no" : 3.0, 
      "sex" : "female", 
      "termd7ays" : 0.0, 
      "illness_type" : "minor", 
      "age" : 31.0, 
      "phone_number" : 8.62125981E8, 
      "address" : "100 Grange Manor,Waterford" 
     } 
    ], 
    "avg_age_of_patients" : 26.25 
} 
Verwandte Themen