【问题标题】:MongoDB String to Double conversion during aggregation pipeline聚合管道期间的 MongoDB String 到 Double 转换
【发布时间】:2020-08-25 21:33:45
【问题描述】:

在我的文档中,十进制值存储为String(因为我在Java 中将BigDecimal 转换为String)。当我一次查看一个文档时,这是完全可以的并且是必需的。但是,我要求在聚合期间将它们视为Double(例如$sum)。

有没有办法让我在聚合管道期间的$project 操作(或其他方式)期间将String 转换为Double。这样我的后续管道将在Double 字段上执行$sum

我没有考虑将它们存储为 Double 的选项,因为我需要保留每个文档的精度,但如果在聚合操作期间精度丢失,我可以。

【问题讨论】:

  • 简单地说,不可以。目前不能在聚合管道中进行投射。您能做的最好的事情就是将“整数/双精度”(后者是“某种”)转为字符串,并且使用 $substr 非常隐晦。如果你现在真的需要“cating”,那么请改用 mapReduce。但是我在这里没有看到我们可以提供答案的用例或代码。如果要使用聚合管道,请将数据存储为双精度。更好的是,将数据存储为两个单独的数字类型。浮点数学 = 头痛。
  • 另外 -- 投票this 以添加对小数/货币类型的支持。有人亲自告诉我这很重要,但我从未见过在实际问题上的任何动静。
  • 你能检查我的答案吗? 5 年后,有一个更简单的解决方案可用 =)

标签: mongodb aggregation-framework


【解决方案1】:

您可以使用$toDouble,它本质上是$convertto: "double" 的简写

假设我们有一个文档;

{
    "str": "3.66"
}

并将string 值转换为double

db.collection.aggregate([
  {
    $addFields: {
      double: {
        $toDouble: "$str"
      }
    }
  }
])

将导致;

{
    "str": "3.66",
    "double": 3.66
}

它可以被聚合管道的其他阶段使用。

查看Mongo Playground

【讨论】:

  • 使用 convert 来更好地处理错误{$convert: { input: "$col_28769", to: "double", onError: "Error", onNull: "Null"}
【解决方案2】:

聚合管道中没有操作符可以进行转换。是否可以将两个不同的值存储为 BigDecimal / String 和另一个作为 double / float 值?如果您可以忽略浮点值导致的片状,那可能是一种快速而肮脏的选择。

【讨论】:

  • 是的,这是一个可能的选择,如果没有其他选择,我也在考虑。我打算在框架级别进行这种转换,以便其余代码对存储方法是透明的。
【解决方案3】:

Mongodb 4.0 版在聚合管道中引入了$toInt 运算符。您可以使用它轻松地从字符串转换为数字。 文档链接:https://docs.mongodb.com/manual/reference/operator/aggregation/toInt/

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2019-02-22
    • 1970-01-01
    • 2019-11-29
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多