【问题标题】:How to use $add aggregate in Mongodb?如何在 Mongodb 中使用 $add 聚合?
【发布时间】:2017-06-23 20:47:13
【问题描述】:

我有一个存储员工数据的集合。这是集合“员工”的文档结构。

{
    "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 = 'Jan-2015'中支付给员工的总工资。我是 Mongodb 的新手,不知道如何编写查询。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    这是一个聚合示例:

    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 不是必需的,但如果您想知道每个示例的薪水是多少,您只需删除 $match 文档,然后进入 $group 设置 _id: "$Employee_Salary.month_year"

    【讨论】:

    • 此查询不返回 2015 年 1 月支付的工资总额..................{ "result" : [ { "_id" : null, “总计”:0 } ],“确定”:1.0000000000000000 }
    • 嗯,这很奇怪,我刚刚用你提供的数据再次测试,我得到了很好的结果:“result”:[{“_id”:null,“total”:300}] .在这里你可以看到集合和聚合:gist.github.com/Cog-g/925dcbd07deb409e24c7
    • 顺便说一句,@SergiuZahari 在我的几秒钟后回答应该也不错。
    【解决方案2】:

    你可以试试:

    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 月支付给所有员工的工资总额。

    【讨论】:

    • 此查询不返回任何内容..这是我在输出中得到的 { "result" : [ { "_id" : null, "total_salary_paied_on_jan_2015" : 0 } ], "ok" : 1.0000000000000000 }
    • 您是否更改了集合名称?
    • 我确信它正在工作,并根据您提供的数据进行了测试。只需更改您的收藏名称,然后再次检查这些字段。
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多