2016-11-28 56 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" 
} 

如何創建針對上述聚集查詢?

回答

0

您可以運行以下聚合管道:

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

在上面聚集,第一管線的步驟與$group操作員組的文件由cityphysician領域,並計算文件的數量(因此患者的數量)通過{ "$sum": 1 }表達以及患者的平均年齡表示{ "$avg": "$age" }表達。

第二個流水線階段{ "$sort": { "count": -1 } }按計數排序先前分組的文檔。這對於進一步分組是必要的,因爲您希望獲得每個city中患者人數最多的physician,即在每個組中,取出具有最大計數的最高文檔。前面的管道確實如此。

這組由city鍵排序的文件,然後返回使用$first運營商所需的字段。

+0

我對您提供的查詢中的$ sort:{count:-1}}感到困惑。這與這種聚合有什麼關係? –

+0

具有'{「$ sort」:{「count」:-1}}的管道階段通過count(發生)命令先前分組的文檔。這對於進一步的分組是必要的,因爲您希望獲得每個城市中患者最多的醫師,即每個組中的患者,獲取計數最多的頂級文檔。前面的管道確實如此。 – chridam

相關問題