【问题标题】:How to get Max and Min Value in MongoDB based on specific key?如何根据特定键在 MongoDB 中获取最大值和最小值?
【发布时间】:2021-08-31 05:10:23
【问题描述】:

我想根据currency 获取emp salary 的最大值和最小值。每个员工都有一个基于currency 的工资范围,所有回复的细节都应该是唯一的。虽然我使用聚合函数 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
    }]
  }
]

【问题讨论】:

  • 您的样本数据是您的集合中的一个文档或集合中有多个文档
  • @mohammadNaimi 样本数据是集合中的 4 个文档,而 id 是手动生成的,而不是自动生成的。

标签: java mongodb


【解决方案1】:

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

  • $unwind - 解构工资数组
  • $group - 按 emp 城市、国家、名称、货币分组,工资的最小值和最大值
  • $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

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2020-10-16
    • 2021-09-09
    • 2011-09-01
    • 2011-07-13
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多