首页 > 解决方案 > MongoDB:按四舍五入值分组

问题描述

让我们举个例子:

{ _id: "xx", total: 12345, name: "Bob" }
{ _id: "xa", total: 123, name: "Bob" }
{ _id: "xb", total: 1290, name: "Bob" }
{ _id: "xc", total: 1255, name: "Bob" }

我想要类似的东西:

[
  { name: '100', count: 1 },
  { name: '1000', count: 2 },
  { name: '10000', count: 1 }
]

实际上,我使用 $project、$concat 和 $group。它有效,但我有两个问题:

  1. 我想像我的例子(100、1000、10000)一样排序,我真的不知道我该怎么做
  2. 实际上它适用于 $concat。我必须写每一个案例,所以这似乎是错误的方式。经过一些研究,我发现 $round 可以取负数。

在我的情况下:123 可能是 100 与 $round(123, -2)。但是我怎样才能动态地拥有我的负面因素?

是的,我真的需要帮助。

感谢和问候,

标签: node.jsmongodbaggregation-frameworkprojection

解决方案


这种聚合应该可以解决您的问题:

db.collection.aggregate([
  {
    $addFields: {
      place: {
        $multiply: [
          {
            $add: [
              {
                $strLenCP: {
                  $toString: "$total",
                },
              },
              -1,
            ],
          },
          -1,
        ],
      },
    },
  },
  {
    $project: {
      name: {
        $round: ["$total", "$place"],
      },
    },
  },
  {
    $group: {
      _id: "$name",
      count: {
        $sum: 1,
      },
    },
  },
  {
    $project: {
      name: {
        $toString: "$_id",
      },
      count: 1,
      _id: 0,
    },
  },
  {
    $sort: {
      name: 1,
    },
  },
])

推荐阅读