【问题标题】:Aggregate documents by a Rounded value Key按舍入值键聚合文档
【发布时间】:2015-07-29 21:51:16
【问题描述】:

示例文档

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

【问题讨论】:

  • 预期输出是什么?
  • 我用示例输出更新了帖子。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

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

例如对于单点精度,乘以 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 }
  }}
])                 

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 2018-01-22
    • 2018-12-31
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多