【问题标题】:How to get Max and Min Value in MongoDB?如何在 MongoDB 中获取最大值和最小值?
【发布时间】:2021-11-08 17:52:28
【问题描述】:

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

样本数据:

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

预期输出:城市、国家/地区,名称应该是唯一的,并且薪水具有基于货币的最大值和最小值。

[
  {
    "emp_city": "city1",
    "emp_country": "country1",
    "emp_name": "emp1",
    "emp_salary": [{
      "currency": "INR",
      "max": 5000,
      "min": 600
    },
    {
      "currency": "DOLLER",
      "max": 600,
      "min": 200
    },
    {
      "currency": "MXN",
      "max": 400,
      "min": 200
    }]
  },
  {
    "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
    }]
  }
]

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    我们可以$group 两次来实现这一点,一次为每个员工 x 货币计算最小值和最大值,然后再次不使用货币来构建最终结构,如下所示:

    db.collection.aggregate([
      {
        $unwind: "$data"
      },
      {
        $unwind: "$data.salary"
      },
      {
        $addFields: {
          currency: {
            "$objectToArray": "$data.salary"
          }
        }
      },
      {
        $unwind: "$currency"
      },
      {
        $group: {
          _id: {
            country: "$data.emp_country",
            city: "$data.emp_city",
            emp_name: "$emp_name",
            currency: "$currency.k"
          },
          max: {
            $max: "$currency.v"
          },
          min: {
            $min: "$currency.v"
          },
          
        }
      },
      {
        $group: {
          _id: {
            country: "$_id.country",
            city: "$_id.city",
            emp_name: "$_id.emp_name",
            
          },
          emp_salary: {
            $push: {
              currency: "$_id.currency",
              max: "$max",
              min: "$min"
            }
          }
        }
      },
      {
        $project: {
          emp_salary: 1,
          emp_country: "$_id.country",
          emp_city: "$_id.city",
          emp_name: "$_id.emp_name",
          _id: 0
        }
      }
    ])
    

    Mongo Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多