MongoDB从不同字段检索最大值

问题描述

为每个文档检索不同字段的最大值(或最小值)的方法是什么?

该集合如下所示:

{
    "_id" : "AQ","arr_delay" : 262421.0,"carrier_delay" : 144922.0,"weather_delay" : 2297.0,"nas_delay" : 15933.0,"security_delay" : 1871.0,"late_aircraft_delay" : 97398.0
}
{
    ...
}

对于集合中的每个文档,我需要查找与文档中其他字段相比具有最小值的字段

解决方法

您可以尝试一下

  • $project fields创建字段数组
db.collection.aggregate([
  {
    $project: {
      fields: {
        $objectToArray: "$$ROOT"
      }
    }
  },
  • $unwind解构fields数组
  { $unwind: "$fields" },
  • $match不包括_id字段,如果您想从此比较中删除,则可以添加更多字段
  {
    $match: {
      "fields.k": { $ne: "_id" }
    }
  },
  • $group_id
  • $max从maxValue中的fields获取最大值
  • $min从minValue的fields中获取分钟数
  {
    $group: {
      _id: "$_id",maxValue: { $max: "$fields.v" },minValue: { $min: "$fields.v" }
    }
  }
])

Playground

,

您需要使用$objectToArray并像这样遍历docs键:

db.collection.aggregate([
  {
    "$addFields": {
      minField: {
        $reduce: {
          input: {
            "$filter": {
              "input": {
                "$objectToArray": "$$ROOT"
              },as: "field",cond: {
                "$setIsSubset": [
                  [
                    {
                      $type: "$$field.v"
                    }
                  ],[
                    "double","decimel",]
                ]
              }
            }
          },initialValue: {
            name: null,minVal: null
          },in: {
            name: {
              $cond: [
                {
                  $lt: [
                    "$$this.v","$$value.minVal"
                  ]
                },"$$this.k","$$value.name"
              ]
            },minVal: {
              $min: [
                "$$this.v","$$value.minVal"
              ]
            }
          }
        }
      }
    }
  },{
    "$addFields": {
      "minField": "$minField.name"
    }
  }
])

MongoPlayground

如果您使用的是Mongo v4.4 +,则也可以使用$isNumber代替$filter的混乱部分。