gpt4 book ai didi

mongodb - 从展开的数组中获取最大值

转载 作者:可可西里 更新时间:2023-11-01 10:37:59 25 4
gpt4 key购买 nike

我有一个文档集合,我想在其中找到 data 对象中每对可能字段的每个比率的最大值。例如:

文件:

[
{ data: { a: 1, b: 5, c: 2 } },
{ data: { a: 4, b: 1, c: 1 } },
{ data: { a: 2, b: 4, c: 3 } }
]

期望的输出:

{
a: { a: 1, b: 4, c: 4 },
b: { a: 5, b: 1, c: 2.5 },
c: { a: 2, b: 1, c: 1 }
}

因此输出 a.b 是 a:b 比率 1/54/12 中最大的一个/4

所以我想我首先使用 $objectToArray 来转换 data,然后对结果使用 $unwind,但是我很难弄清楚如何将所有内容组合在一起的时间。我拥有的文档数量不会太大,但是 data 中的键数可能只有几千个,所以我不确定 Mongo 能处理多好一堆 $lookup 并比较这样的值。

最佳答案

您可以尝试以下聚合:

db.col.aggregate([
{
$addFields: { data: { $objectToArray: "$data" } }
},
{
$project: {
pairs: {
$map: {
input: { $range: [ 0, { $multiply: [ { $size: "$data" }, { $size: "$data" } ] } ] },
as: "index",
in: {
$let: {
vars: {
leftIndex: { $floor: { $divide: [ "$$index", { $size: "$data" } ] } },
rightIndex: { $mod: [ "$$index", { $size: "$data" } ] }
},
in: {
l: { $arrayElemAt: [ "$data", "$$leftIndex" ] },
r: { $arrayElemAt: [ "$data", "$$rightIndex" ] }
}
}
}
}
}
}
},
{ $unwind: "$pairs" },
{
$group: {
_id: { l: "$pairs.l.k", r: "$pairs.r.k" },
value: { $max: { $divide: [ "$pairs.l.v", "$pairs.r.v" ] } }
}
},
{
$sort: {
"_id.l": 1, "_id.r": 1
}
},
{
$group: {
_id: "$_id.l",
values: { $push: { k: "$_id.r", v: "$value" } }
}
},
{
$addFields: { values: { $arrayToObject: "$values" } }
},
{
$project: {
root: [ { k: "$_id", v: "$values" } ]
}
},
{
$sort: { "root.k": 1 }
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: "$root"
}
}
}
])

基本上你需要$objectToArray$arrayToObject在数组和对象之间转换。基本上,要点是对于每个对象,您需要生成 nxn 对(在本例中为 3x3=9)。您可以使用 $range 执行此类迭代运算符(operator)。然后使用 $mod$divide$floor你可以获得像 (0,0)...(2,2) 这样的索引对。那么你只需要 $group$max获取每个对类型的最大值(如 ab 等等)。要获得最终形状,您还需要 $replaceRoot .

输出:

{ "a" : { "a" : 1, "b" : 4, "c" : 4 } }
{ "b" : { "a" : 5, "b" : 1, "c" : 2.5 } }
{ "c" : { "a" : 2, "b" : 1, "c" : 1 } }

关于mongodb - 从展开的数组中获取最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com