示例文档
[
{
value: 207.9
},
{
value: 208.1
},
{
value: 202.1
},
{
value: 201.9
}
]
您如何使用MongoDB的聚合框架将文档分组到彼此数值范围内的聚类中?如何将示例文档拆分为两个单独的组,一个组包含值为207.9和208.1的文档,另一个组包含值为202.1和201.9的文档?
我不确定_id是什么,因为分组不是静态值。预期的输出看起来像
[
{
_id: ?
avg: 208,
count: 2
},
{
_id: ?
avg: 202,
count: 2
}
]
答案 0 :(得分:2)
你可以,但它取决于你如何实现数学的小数点精度。
例如,对于单点精度,乘以10:
db.items.aggregate([
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
"$value",
{ "$mod": [ "$value", 1 ] }
]},
{ "$cond": [
{ "$lt": [
{ "$mod": [
{ "$multiply": [ "$value", 10 ] },
10
]},
5
]},
0,
1
]}
]
},
"count": { "$sum": 1 }
}}
])
$mod
和$multiply
操作将第一个小数转换为1到10之间的数字。如果该值小于5,则返回0,否则为1,然后将其添加到舍入的底层原始号码。
结果如下:
{ "_id" : 202, "count" : 2 }
{ "_id" : 208, "count" : 2 }
只需将数字乘以10即可更改结果中的精度。
如果您根本不关心精确度,那么可以缩短时间:
db.items.aggregate([
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
"$value",
{ "$mod": [ "$value", 1 ] }
]},
{ "$cond": [
{ "$lt": [
{ "$mod": [ "$value", 1 ] },
0.5
]},
0,
1
]}
]
},
"count": { "$sum": 1 }
}}
])