Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mongodb中同时获取多个字段的argmax/argmin?_Mongodb - Fatal编程技术网

如何在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'
        }
    }
])

假设它总是返回第一个匹配结果。这是一个了不起的解决方案!非常感谢。但是我不确定这个查询的性能如何?就像和排序比较一样,它应该可以处理几千个文档。当我有时间想出一个更有效的方法时,我会再试一试。