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"
}
}
])
如果您使用的是 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
$max
从 fields
中获取最大值
$min
从 fields
中获取最小值
{
$group: {
_id: "$_id",
maxValue: { $max: "$fields.v" },
minValue: { $min: "$fields.v" }
}
}
])
检索每个文档的不同字段的最大(或最小)值的方法是什么?
集合如下所示:
{
"_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"
}
}
])
如果您使用的是 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
$max
从fields
中获取最大值$min
从fields
中获取最小值
{
$group: {
_id: "$_id",
maxValue: { $max: "$fields.v" },
minValue: { $min: "$fields.v" }
}
}
])