gpt4 book ai didi

MongoDB 聚合,按值区间分组,

转载 作者:行者123 更新时间:2023-12-02 17:09:43 24 4
gpt4 key购买 nike

MongoDB 文档:

[{
_id: '123213',
elevation: 2300,
area: 25
},
{
_id: '343221',
elevation: 1600,
area: 35,
},
{
_id: '545322',
elevation: 500
area: 12,
},
{
_id: '234234',
elevation: null,
area: 5
}]

我想在给定的高程间隔上对这些进行分组并总结面积属性。

  • 第 1 组:< 0
  • 第 2 组:0 - 1500
  • 第 3 组:1501 - 3000,
  • 第 4 组:> 3000

所以预期的输出是:

[{
interval: '1501-3000',
count: 2,
summarizedArea: 60
},
{
interval: '0-1500',
count: 1,
summarizedArea: 12,
},
{
interval: 'N/A',
count: 1,
summarizedArea: 5
}]

如果可能,我想使用聚合管道

也许是 $range?或者 $gte$lte 的组合?

最佳答案

正如 Feliix 建议的那样 $bucket应该可以完成这项工作,但边界应该略有不同,以便与负数和 N/A 配合使用值(value)观:

db.collection.aggregate([
{
$bucket: {
groupBy: "$elevation",
boundaries: [ -Number.MAX_VALUE, 0, 1501, 3001, Number.POSITIVE_INFINITY ],
default: Number.NEGATIVE_INFINITY,
output: {
"count": { $sum: 1 },
"summarizedArea" : { $sum: "$area" }
}
}
}
])

可以将下面的格式化阶段添加到管道中以调整响应的形状:

  { $group: {
_id: null,
documents: { $push: {
interval: { $let: {
vars: {
idx: { $switch: {
branches: [
{ case: { $eq: [ "$_id", -Number.MAX_VALUE ] }, then: 3 },
{ case: { $eq: [ "$_id", 0 ] }, then: 2 },
{ case: { $eq: [ "$_id", 1501 ] }, then: 1 },
{ case: { $eq: [ "$_id", 3001 ] }, then: 0 }
],
default: 4
} }
},
in: { $arrayElemAt: [ [ ">3000", "1501-3000", "0-1500", "<0", "N/A" ], "$$idx" ] }
} },
count: "$count",
summarizedArea: "$summarizedArea"
} }
} }

$group_id: null $push将所有组放入单个文档的数组中。

$let map $_id从前一阶段到数组[ ">3000", "1501-3000", "0-1500", "<0", "N/A" ]中定义的区间文本标签.为此它计算idx使用 $switch 的标签索引.

除非您绝对需要在管道中执行,否则在应用程序级别实现逻辑一定要简单得多。

关于MongoDB 聚合,按值区间分组,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49874145/

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