2016-11-28 4 views
0

各都市に最も多くの患者を持つ医師を表示する集約クエリを作成したいと考えています。それは各都市の平均年齢でも機能します。例えば各都市の患者数に基づいて医師の最高発生を見つける

{ 
    City: "Vancouver" 
    Physician: "Physician Test1" 
    Average_Age: 56 
}, 
{ 
    City: "Burnaby" 
    Physician: "Physician Test2" 
    Average_Age: 40 
} 

私のデータの一部

{ 
     "gender" : "Female", 
     "full_name" : "Test Patient", 
     "age" : 20, 
     "city" : "Burnaby", 
     "severity_code" : 2, 
     "PHN" : "11-1111111", 
     "primary_physician" : "Physician Test1", 
     "location" : "4A", 
     "attendance_method" : "Self-Driven" 
}, 
{ 
     "gender" : "Male", 
     "full_name" : "Test2 Patient2", 
     "age" : 68, 
     "city" : "Vancouver", 
     "severity_code" : 1, 
     "PHN" : "00-0000000", 
     "primary_physician" : "Physician Test2", 
     "location" : "6D", 
     "attendance_method" : "Walk-In" 
} 

の例は、どのように私は上記の集計クエリを作成するのですか? (上記の集約で

db.patients.aggregate([ 
    { 
     "$group": { 
      "_id": { 
       "City": "$city", 
       "Physician": "$primary_physician" 
      }, 
      "count": { "$sum": 1 }, 
      "Average_Age": { "$avg": "$age" }    
     } 
    }, 
    { "$sort": { "count": -1 } }, 
    { 
     "$group": { 
      "_id": "$_id.City" 
      "Physician": { "$first": "$_id.Physician" }, 
      "Number_of_Patients": { "$first": "$count" }, 
      "Average_Age": { "$first": "$Average_Age" }   
     } 
    } 
]) 

cityphysicianフィールドによって$groupオペレーターグループ文書と第1パイプラインステップとドキュメントの数を計算します。

答えて

0

次集約パイプラインを実行することができますしたがって患者の数)を{ "$sum": 1 }発現を介してグループ内で測定し、また{ "$avg": "$age" }発現を有する患者の平均年齢を集計した。

第2のパイプラインステージ{ "$sort": { "count": -1 } }は、以前にグループ化されたドキュメントを数えて注文します。各グループの中で最も多くの患者を持つphysicianを取得したいので、これはさらにグループ分けするために必要です。先行するパイプラインはこれを排除します。

cityキーでソートされたドキュメントをグループ化し、$firstオペレータを使用して、必要なフィールドを返します。

+0

あなたが提供したクエリで$ sort:{count:-1}}が混乱しています。この集合体ではどのように機能しますか? –

+0

'{" $ sort ":{" count ":-1}}のパイプラインステージは、以前にグループ化されたドキュメントをカウント(オカレンス)で並べ替えます。これは、各グループの各市町村に最も多くの患者を持つ医師を取得したいので、さらにグループ分けするために必要です。先行するパイプラインはこれを排除します。 – chridam

関連する問題