MongoDB-如何将浮点值总计截断为一或两个小数点?

Rah*_*Raj 1 mongodb mongodb-query aggregation-framework

假设这是查询:

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}
])
Run Code Online (Sandbox Code Playgroud)

我得到的输出:

{ "_id" : "John Wayne", "numFilms" : 107, "average" : 6.424299065420561 }
Run Code Online (Sandbox Code Playgroud)

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

{ "_id" : "John Wayne", "numFilms" : 107, "average" : 6.42 }
Run Code Online (Sandbox Code Playgroud)

我尝试了这篇文章,但似乎我无法摆脱与$avg运算符做同样的事情。谁能告诉我如何实现这一目标?

并且请不要将前面提到的帖子直接标记为重复的帖子,这在这里没有回答我与$avg操作员有关的问题。

Kev*_*ith 5

您可以通过实现这一目标$project的舞台$trunc,但$multiply之前并$divide应对小数位之后。

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

db.test.insertMany([{
    number: 123.456
}, {
    number: 456.789
}, {
    number: 123
}]);
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下命令运行聚合:

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

这将给我们:

{ "_id" : ObjectId("5ab23dcb8094b7e4427b43f3"), "number" : 123.45 }
{ "_id" : ObjectId("5ab23dcb8094b7e4427b43f4"), "number" : 456.78 }
{ "_id" : ObjectId("5ab23dcb8094b7e4427b43f5"), "number" : 123 }
Run Code Online (Sandbox Code Playgroud)

  • **更新:** 自 v4.2 以来,`$trunc` 用法已更改。现在你只需执行`$trunc:['$number',2]`即可获得2位小数精度。 (2认同)