1

我有一个员工名单,每个人都属于一个部门和一个公司。

员工也有工资历史。最后一个值是他们当前的薪水。

例子:

{
  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 是正确的运算符吗?如果是,我该如何在项目中使用它?

4

2 回答 2

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 
于 2013-05-17T08:36:46.690 回答
0

现在您可以在聚合中使用 $slice。从数组的开头或结尾{ $slice: [ <array>, <n> ] } 返回元素: 从数组中的指定位置返回元素:{ $slice: [ <array>, <position>, <n> ] }

还有来自 mongo 页面的几个例子:

{ $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 ]
于 2015-11-09T06:54:07.550 回答