2013-05-16 79 views
1

我有一份員工名單,每名員工屬於一個部門和一家公司。可能使用聚合框架使用slice操作符?

員工還有薪水歷史。最後一個值是他們目前的薪水。

例子:

{ 
    name: "Programmer 1" 
    employee_id: 1, 
    dept_id: 1, 
    company_id: 1, 
    salary: [50000,50100,50200] 
}, 
{ 
    name: "Programmer 2" 
    employee_id: 2, 
    dept_id: 1, 
    company_id: 1, 
    salary: [50000,50200,50300] 
}, 
{ 
    name: "Manager" 
    employee_id: 3, 
    dept_id: 2, 
    company_id: 1, 
    salary: [60000,60500,61000] 
}, 
{ 
    name: "Contractor (different company)" 
    employee_id: 4, 
    dept_id: 1, 
    company_id: 2, 
    salary: [60000,60500,75000] 
} 

我想找到員工目前的平均工資,由dept_id爲和的company_id分組。

是這樣的:

db.employees.aggregate(
    { $project : { employee_id: 1, dept_id: 1, company_id: 1, salaries: 1}}, 
    { $unwind : "$salaries" }, 
    { 
    "$group" : { 
     "_id" : { 
      "dept_id" : "$dept_id", 
      "company_id" : "$company_id", 
     }, 
     current_salary_avg : { $avg : "$salaries.last()" } 
    } 
    } 
); 

在這種情況下這將是

公司1,第1組:50250

公司1,組2:61000

公司2,組1:75000

我見過一些類似於$ unwind的例子,但我正在努力獲得薪水的最後價值。在這種情況下,$ slice是否是正確的操作符,如果是這樣的話,我如何在項目中使用它?

+0

沒有排序,你可以得到最後的東西,你需要一種即使片,讓你覺得你會得到 – Sammaye

回答

2

在這種情況下,你需要設置你的管道如下:

  1. 放鬆身心的工資表把所有的工資爲每個員工
  2. 組由員工,部門和企業,並獲得最後的薪水
  3. 組由部門和公司,並獲得平均工資

此聚集管道的代碼是:

use test; 

db.employees.aggregate([ 
    {$unwind : "$salary"}, 
    { 
     "$group" : { 
      "_id" : { 
       "dept_id" : "$dept_id", 
       "company_id" : "$company_id", 
       "employee_id" : "$employee_id", 
      }, 
      "salary" : {$last: "$salary"} 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : { 
       "company_id" : "$_id.company_id", 
       "dept_id" : "$_id.dept_id", 
      }, 
      "current_salary_avg" : {$avg: "$salary"} 
     } 
    }, 
    {$sort : 
    { 
     "_id.company_id" : 1, 
     "_id.dept_id" : 1, 
    } 
    }, 

]); 

假設您已經導入的數據有:

mongoimport --drop -d test -c employees <<EOF 
{ name: "Programmer 1",     employee_id: 1, dept_id: 1, company_id: 1, salary: [50000,50100,50200]} 
{ name: "Programmer 2",     employee_id: 2, dept_id: 1, company_id: 1, salary: [50000,50200,50300]} 
{ name: "Manager",       employee_id: 3, dept_id: 2, company_id: 1, salary: [60000,60500,61000]} 
{ name: "Contractor (different company)", employee_id: 4, dept_id: 1, company_id: 2, salary: [60000,60500,75000]} 
EOF 
+0

完美的最後一個值。步驟2分組是我錯過的。非常感謝。 –

+0

不客氣。儘管如果您將數據更改爲具有單個薪水標量和salary_history數組,可能會更簡單。 – jimoleary

0

現在你可以使用$slice in aggregation。要從數組的開頭或結尾返回元素:{ $slice: [ <array>, <n> ] } 要從數組中的指定位置返回元素:{ $slice: [ <array>, <position>, <n> ] }

和一對夫婦從蒙戈頁面的例子:

{ $slice: [ [ 1, 2, 3 ], 1, 1 ] } // [ 2 ] 
{ $slice: [ [ 1, 2, 3 ], -2 ] }  // [ 2, 3 ] 
{ $slice: [ [ 1, 2, 3 ], 15, 2 ] } // [ ] 
{ $slice: [ [ 1, 2, 3 ], -15, 2 ] } // [ 1, 2 ]