MongoDB 从不同字段中检索最大值

MongoDB retrive max value from different fields

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

集合如下所示:

{
    "_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
}
{
    ...
}

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

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

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.

的混乱部分

你可以试试这个,

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

Playground