2015-12-10 114 views
1

我有一個存儲員工數據的集合。這是集合'員工'的文檔結構。

{ 
    "emp_id" : 3, 
    "Employee_Name" : "Farquleet Shadab", 
    "Employee_Gender" : "Male", 
    "Employee_Salary" : [ 
     { 
      "month_year" : "Jan-2015", 
      "salary_paid" : 100 

     }, 
     { 
      "month_year" : "Feb-2015", 
      "salary_paid" : 100 
     } 
    ] 
}, 

{ 
    "emp_id" : 4, 
    "Employee_Name" : "John Robert", 
    "Employee_Gender" : "Male", 
    "Employee_Salary" : [ 
     { 
      "month_year" : "Jan-2015", 
      "salary_paid" : 200 

     }, 
     { 
      "month_year" : "Feb-2015", 
      "salary_paid" : 200 
     } 
    ] 
} 

現在我想寫編寫一個查詢來發現MONTH_YEAR =「揚2015年」支付給職工的工資總額。我是Mongodb的新手,不知道如何編寫查詢。

回答

1

你可以試試:

db.collection.aggregate([ 
    {$unwind: "$Employee_Salary"}, 
    {$match: {"Employee_Salary.month_year": "Jan-2015" }}, 
    {$project: {salary_paid: "$Employee_Salary.salary_paid"}}, 
    {$group: {_id: null, total_salary_paied_on_jan_2015: {$sum: "$salary_paid"}}} 
]) 

這種聚合查詢會計算2015年1月支付給所有員工的工資總額。

+0

該查詢返回nothing..this是我得到的輸出{ 「結果」:[{ 「_id」:空, 「total_salary_paied_on_jan_2015」:0 } ], 「OK」:1.0000000000000000 } –

+0

是否更改了集合名稱? – sergiuz

+0

是的,我改變了它 –

2

下面是一個聚合例如:

db.salary.aggregate([ 
    { 
     $unwind: "$Employee_Salary" 
    } 
    ,{ 
     $match: 
     { 
      "Employee_Salary.month_year" : "Jan-2015" 
     } 
    } 
    ,{ 
     $group: 
     { 
      _id:null, 
      total: { $sum: "$Employee_Salary.salary_paid" } 
     } 
    } 
]) 

$unwind就炸掉你的陣列,從而爲每個不同的文件。然後,$match將只保留匹配的月份。最後,$group將從剩下的文檔中添加所有薪水。

注:_id是沒有必要的,但如果你想每例如多少錢是每月薪水就知道了,你只需要刪除$匹配文檔,並進入$group設置_id: "$Employee_Salary.month_year"

+0

此查詢不返回一月至2015年的月支付的工資總額.............. { 「結果」:[{ 「_id」:空, 「總共「:0 } ], 」ok「:1.0000000000000000 } –

+0

嗯,這很奇怪,我剛剛再次測試您提供的數據,並且我得到了很好的結果:」result「:[{」_id「 :null,「total」:300}]。在這裏,你可以看到收集和聚合:https://gist.github.com/Cog-g/925dcbd07deb409e24c7 –

+0

順便說一句,從@SergiuZaharie回答幾秒鐘後,我的也應該是好的。 –