问题描述
为每个文档检索不同字段的最大值(或最小值)的方法是什么?
该集合如下所示:
{
"_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" }
}
}
])
,
您需要使用$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"
}
}
])
如果您使用的是Mongo v4.4 +,则也可以使用$isNumber代替$filter
的混乱部分。