可以将slice运算符与聚合框架一起使用吗?

时间:2013-05-16 20:17:53

标签: mongodb slice aggregation-framework

我有一份员工清单,每个员工都属于某个部门和公司。

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

示例:

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

2 个答案:

答案 0 :(得分:2)

在这种情况下,您需要按如下方式设置管道:

  1. 解除工资清单以获得每位员工的所有工资
  2. 按员工,部门和公司分组并获得最后一份薪水
  3. 按部门和公司分组并获得平均工资
  4. 此聚合管道的代码是:

    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 
    

答案 1 :(得分:0)

现在您可以使用$slice in aggregation。要从数组的开头或结尾返回元素:{ $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 ]