如何在mongodb中同时获取多个字段的argmax/argmin?
下面是我正在处理的数据示例如何在mongodb中同时获取多个字段的argmax/argmin?,mongodb,Mongodb,下面是我正在处理的数据示例 [ { “uid”:“111”, “a”:1, “b”:3, “c”:1, }, { “uid”:“222”, “a”:2, “b”:2, “c”:2 }, { “uid”:“333”, “a”:3, “b”:1, “c”:3 } ] 然后,我想对字段“a”和“b”执行argmax,对字段“c”执行argmin,并返回“uid”作为结果 例如: 对于“a”,它的最大值是3,对应的“uid”是“333”,因此“a”的argmax应该是“uid”:“333” 问题是应该
[
{
“uid”:“111”,
“a”:1,
“b”:3,
“c”:1,
},
{
“uid”:“222”,
“a”:2,
“b”:2,
“c”:2
},
{
“uid”:“333”,
“a”:3,
“b”:1,
“c”:3
}
]
然后,我想对字段“a”和“b”执行argmax
,对字段“c”执行argmin
,并返回“uid”
作为结果
例如:
对于“a”,它的最大值是3,对应的“uid”是“333”,因此“a”的argmax
应该是“uid”:“333”
问题是应该执行什么查询,以便我可以得到如下结果
[
{
“argmax_of_a”:“333”,
“argmax_of_b”:“111”,
“argmin_of_c”:“111”,
}
]
这是我正在玩的截取的代码
我可以找到某种方法来获取一个特定字段的argmax/argmin
,但我不知道如何同时处理多个字段
提前谢谢 尝试一下这个攻击管道:
db.collection.aggregate(
[
{
$group: {
_id: null,
a: { $push: { uid: '$uid', val: '$a' } },
b: { $push: { uid: '$uid', val: '$b' } },
c: { $push: { uid: '$uid', val: '$c' } }
}
},
{
$project: {
_id: 0,
max_of_a: { $arrayElemAt: ["$a", { $indexOfArray: ["$a.val", { $max: '$a.val' }] }] },
max_of_b: { $arrayElemAt: ["$b", { $indexOfArray: ["$b.val", { $max: '$b.val' }] }] },
max_of_c: { $arrayElemAt: ["$c", { $indexOfArray: ["$c.val", { $max: '$c.val' }] }] }
}
},
{
$project: {
arg_max_of_a: '$max_of_a.uid',
arg_max_of_b: '$max_of_b.uid',
arg_max_of_c: '$max_of_c.uid'
}
}
])
假设它总是返回第一个匹配结果。这是一个了不起的解决方案!非常感谢。但是我不确定这个查询的性能如何?就像和排序比较一样,它应该可以处理几千个文档。当我有时间想出一个更有效的方法时,我会再试一试。