聚合管道期间MongoDB字符串到双精度转换

聚合管道期间MongoDB字符串到双精度转换,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在我的文档中,十进制值存储为String(因为Java中的BigDecimal转换为String)。当我一次查看一个文档时,这是完全可以的,也是必需的。但是,我要求它们在聚合过程中被视为双倍(例如,$sum) 是否有一种方法可以在聚合管道期间的$project操作(或其他操作)期间将字符串转换为Double。这样,我的后续管道将在Double字段上执行$sum 我没有考虑将它们存储为双精度的选项,因为我需要保留每个文档的精度,但如果在聚合操作期间精度丢失,我可以确定。在聚合管道中没有运算符进行转

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

是否有一种方法可以在聚合管道期间的
$project
操作(或其他操作)期间将
字符串
转换为
Double
。这样,我的后续管道将在
Double
字段上执行
$sum


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

在聚合管道中没有运算符进行转换。是否可以存储两个不同的值,一个是bigdecim/String,另一个是double/float?如果您可以忽略由于浮点值而产生的片状,那么这可能是一个快速且肮脏的选项。

Mongodb 4.0版在聚合管道中引入了
$toInt
操作符。您可以使用它轻松地将字符串转换为数字。 链接到文档:

您可以使用,它本质上是with
到:“double”的缩写

假设我们有一份文件

{
    "str": "3.66"
}
并将
字符串
值转换为
双精度

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

{
    "str": "3.66",
    "double": 3.66
}
它可以被聚合管道的其他阶段使用


检查

简单地说,不。您目前无法在聚合管道中强制转换。您所能做的最好的方法是将“integer/double”(后者是“sort of”)转换为字符串,并通过使用
$substr
非常模糊地进行转换。如果您现在真的需要“cating”,请使用mapReduce。但我没有看到我们可以提供答案的用例或代码。如果要使用聚合管道,请将数据存储为double。更好的是,将数据存储为两种不同的数字类型。浮点数学=头痛。另外--投票问题增加对十进制/货币类型的支持。有人亲自告诉我这很重要,但我从未看到在实际问题上有任何进展。相关:你能检查一下我的答案吗?5年后,一个更简单的解决方案出现了=)是的,如果没有其他选择,这也是我正在考虑的一个可能的选择。我计划在框架级别进行此转换,以便代码的其余部分对存储方法是透明的。使用convert可以更好地处理错误
{$convert:{input:“$colu 28769”,to:“double”,onError:“error”,onNull:“Null”}