通过圆角值Key汇总文档

时间:2015-07-29 21:51:17

标签: mongodb mongodb-query aggregation-framework

示例文档

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

1 个答案:

答案 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 }
  }}
])