按舍入值键聚合文档

Aggregate documents by a Rounded value Key

示例文档

[
  {
    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
  }
]

你可以,但这取决于你如何实现数学的小数点精度。

比如单点精度,乘以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 and $multiply 操作将第一个小数转换为 1 到 10 之间的数字。如果该值小于 5,则 return 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 }
  }}
])