java - 如何根据特定键获取 MongoDB 中的最大值和最小值?

标签 java mongodb

我想根据currency获取emp salary的最大值和最小值。每个员工都有一个基于货币的薪资范围,并且所有响应的详细信息都应该是唯一的。虽然我使用聚合函数 min 和 max 但它获取工资金额的最大值和最小值,但我需要根据 currency 字段获取最大值和最小值。

示例数据:

[
  {
    "id": "1",
    "emp_name": "emp1",
    "data": [
      {
        "emp_country": "country1",
        "emp_city": "city1",
        "salary": [
          {
            "currency": "INR",
            "amount": 5000
          },
          {
            "currency": "INR",
            "amount": 600
          },
          {
            "currency": "MXN",
            "amount": 400
          }
        ]
      },
      {
        "emp_country": "country1",
        "emp_city": "city2",
        "salary": [
          {
            "currency": "DOLLER",
            "amount": 5000
          },
          {
            "currency": "DOLLER",
            "amount": 200
          },
          {
            "currency": "MXN",
            "amount": 400
          }
        ]
      }
    ]
  },
  {
    "id": "2",
    "emp_name": "emp2",
    "data": [
      {
        "emp_country": "country2",
        "emp_city": "city2",
        "salary": [
          {
            "currency": "INR",
            "amount": 5000
          },
          {
            "currency": "MXN",
            "amount": 200
          },
          {
            "currency": "MXN",
            "amount": 400
          }
        ]
      }
    ]
  },
  {
    "id": "3",
    "emp_name": "emp3",
    "data": [
      {
        "emp_country": "country1",
        "emp_city": "city1",
        "salary": [
          {
            "currency": "MXN",
            "amount": 400
          }
        ]
      }
    ]
  },
  {
    "id": "4",
    "emp_name": "emp4",
    "data": [
      {
        "emp_country": "country1",
        "emp_city": "city2",
        "salary": [
          {
            "currency": "DOLLER",
            "amount": 200
          }
        ]
      }
    ]
  }
]

预期输出: 城市,国家,名称应该是唯一的,工资有基于货币的最大和最小。

[
  {
    "emp_city": "city1",
    "emp_country": "country1",
    "emp_name": "emp1",
    "emp_salary": [{
      "currency": "INR",
      "max": 5000,
      "min": 600
    },
    {
      "currency": "MXN",
      "max": 400,
      "min": 400
    }]
  },
  {
    "emp_city": "city2",
    "emp_country": "country1",
    "emp_name": "emp1",
    "emp_salary":[ {
      "currency": "DOLLER",
      "max": 5000,
      "min": 200
    },
    {
      "currency": "MXN",
      "max": 400,
      "min": 400
    }]
  },
  {
    "emp_city": "city2",
    "emp_country": "country2",
    "emp_name": "emp2",
    "emp_salary": [{
      "currency": "INR",
      "max": 5000,
      "min": 5000
    },
    {
      "currency": "MXN",
      "max": 400,
      "min": 200
    }]
  },
  {
    "emp_city": "city1",
    "emp_country": "country1",
    "emp_name": "emp3",
    "emp_salary": [{
      "currency": "MXN",
      "max": 400,
      "min": 400
    }]
  },
  {
    "emp_city": "city2",
    "emp_country": "country1",
    "emp_name": "emp4",
    "emp_salary": [{
      "currency": "DOLLER",
      "max": 200,
      "min": 200
    }]
  }
]

最佳答案

我们可以使用聚合查询来实现上述结果。

  • $unwind - 解构工资数组
  • $group - 按雇员城市、国家/地区、姓名、货币以及工资的最小值和最大值进行分组
  • $group - 使用另一个推送 emp_salary
  • $project - 以您的格式显示字段
db.collection.aggregate([
  {
    "$unwind": {
      "path": "$data"
    }
  },
  {
    "$unwind": {
      "path": "$data.salary"
    }
  },
  {
    "$group": {
      "_id": {
        "emp_city": "$data.emp_city",
        "emp_country": "$data.emp_country",
        "emp_name": "$emp_name",
        "currency": "$data.salary.currency",
        
      },
      "max": {
        "$max": "$data.salary.amount"
      },
      "min": {
        "$min": "$data.salary.amount"
      }
    }
  },
  {
    "$group": {
      "_id": {
        "emp_city": "$_id.emp_city",
        "emp_country": "$_id.emp_country",
        "emp_name": "$_id.emp_name",
        
      },
      "emp_salary": {
        "$push": {
          "currency": "$_id.currency",
          "min": "$min",
          "max": "$max"
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "emp_city": "$_id.emp_city",
      "emp_country": "$_id.emp_country",
      "emp_name": "$_id.emp_name",
      "emp_salary": 1,
      
    }
  }
])

Mongo Playground

关于java - 如何根据特定键获取 MongoDB 中的最大值和最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68993192/

相关文章:

java - 在数组的 editText 中搜索相关词

java - 帮助了解 Android 应用加载页面中的事件顺序

c# - MongoDb c# 2.0 驱动程序 - 我如何计算服务器上的聚合计数?

javascript - 需要使用 Node.js 在 AWS 上实现 5000 个并发 api 点击

java - 如何通过环境变量设置 Java 的最小和最大堆大小?

java - sbt 更新时未检测到 Java 安装

ruby-on-rails-3 - ruby on Rails 中变量后面的感叹号是什么意思?

javascript - 如何在 Mongoose 中检索子文档

mongodb - 为什么 MongoDB 不使用索引交集?

java - 对两个 java 实例进行 strace