【问题标题】:MongoDB - How to Truncate Float Values to One or Two decimal points in aggregate?MongoDB - 如何将浮点值截断为一个或两个小数点?
【发布时间】:2021-06-29 05:37:28
【问题描述】:

假设这是查询:

db.movies.aggregate([
  {$match: {languages: "English", cast:{$exists:true}}},

  {$unwind: "$cast"},

  {$group: {_id: "$cast", numFilms:{$sum: 1}, average:{$avg: "$imdb.rating"}   
  }},

  {$sort: {numFilms:-1}},

  {$limit: 1}
])

我得到了输出:

{ "_id" : "John Wayne", "numFilms" : 107, "average" : 6.424299065420561 }

如何将average 截断为单/双小数点?我想看到这样的输出:

{ "_id" : "John Wayne", "numFilms" : 107, "average" : 6.42 }

我尝试了这个post,但似乎我无法对$avg 操作员做同样的事情。我怎样才能做到这一点?

可能重复

我相信上面的链接不是重复的,因为我处理的是$avg 运算符。

【问题讨论】:

  • 只想提一下,截断/舍入小数点都适合我,以防万一只能舍入。我也找不到后一种情况。
  • 我的问题不同,如果您正确阅读了我的问题,我正在寻找一个答案,其中$avg 运算符仍然可以使用,这与我明确提到的其他帖子不同。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以使用$project 阶段来实现此目的,其中$trunc 但在$multiply 之前和$divide 之后处理小数位。

例如,如果我们添加以下内容:

db.test.insertMany([{
    number: 123.456
}, {
    number: 456.789
}, {
    number: 123
}]);

我们可以使用以下方式运行聚合:

db.test.aggregate([{
    $project: {
        number: {
            $divide: [{
                $trunc: {
                    $multiply: ["$number", 100]
                }
            }, 100]
        }
    }
}])

这会给我们:

{ "_id" : ObjectId("5ab23dcb8094b7e4427b43f3"), "number" : 123.45 }
{ "_id" : ObjectId("5ab23dcb8094b7e4427b43f4"), "number" : 456.78 }
{ "_id" : ObjectId("5ab23dcb8094b7e4427b43f5"), "number" : 123 }

【讨论】:

  • 所以您的意思是无法使用avg 运算符截断/舍入?
  • $avg 运算符没有选项可以舍入,因此您必须在 $group 阶段之后作为单独的阶段执行此操作,
  • 查看我对现有问题的回答。 stackoverflow.com/questions/17482623/…
  • @KevinSmith 谢谢你的信息。
  • 更新: $trunc 的用法自 v4.2 起发生了变化。现在您只需要做$trunc:['$number',2] 即可获得 2 位小数精度。
【解决方案2】:
$project : {
    artistAmt : {
        $divide: [{
            $trunc: {
                $multiply: ["$earnedAmount", 100]
            }
        }, 100]
    }
}    
before : "artistAmt": 1361.8100000000002
after : "artistAmt": 1361.81

【讨论】:

  • 请提供解释您的解决方案的描述
猜你喜欢
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多