Grails Mongo GORM 插件 - 浮点和字节的映射是字符串而不是数字

Posted

技术标签:

【中文标题】Grails Mongo GORM 插件 - 浮点和字节的映射是字符串而不是数字【英文标题】:Grails Mongo GORM Plugin - Mapping of Float and Byte is String instead of number 【发布时间】:2013-05-23 05:52:24 【问题描述】:

在使用 Grails MongoDB GORM 插件时,我意识到 Integers 被正确映射到 mongo 数字,Long 被映射到 NumberLong 等等。

唯一不能正确映射的类型是 Byte 和 Float。它们被映射到字符串。我希望是 mongo 数字。我是否需要按照此处所述编写自定义编组器:

http://springsource.github.io/grails-data-mapping/mongo/manual/guide/3.%20Mapping%20Domain%20Classes%20to%20Mongo%20Collections.html#3.6%20Custom%20User%20Types

或者有没有更合适的方法?

谢谢, 马特奥

【问题讨论】:

您是否尝试通过在数字末尾添加“d”或“f”来指定数字是浮点数还是双精度数,例如。 40.739037d。 Groovy 的十进制数的默认类型是 BigDecimal,MongoDB 不支持它。从您链接的页面。 当你说字节时,你的意思是字节数组吗?二进制类型? 不,我没有,老实说,这不会那么容易。我将这个特定的域从 mysql 切换到了 mongo,这真的很难控制。我知道 Double 已正确映射到 mongo - 插件的代码根本没有指定 Float、Byte 等这些属性。我的意思是 Byte - 范围内的数字 -128 +127 MongoDB 中没有“字节”类型 - 您可以在 bsonspec.org 上查看支持的类型 我知道,但是有 Byte Java,因此我希望这将作为支持的数字映射到 Mongo,即 int32。就像实现了(Java)Long - 我认为它在 Mongo 中映射到 int64 【参考方案1】:

我没有看到您描述的问题。如果我有一个看起来像这样的域对象:

class Person 
    String firstName
    String lastName
    byte bytePrimitiveValue = 8;
    float floatPrimitiveVal = 4.38;
    Byte byteValue = 9;
    Float floatVal = 5.06;

然后你将它插入到数据库中:

def person = new Person1(firstName: "the name", lastName: "smith")
person.save()

我确实在数据库中看到了预期的类型:


    "_id" : NumberLong(7),
    "bytePrimitiveValue" : 8,
    "byteValue" : 9,
    "firstName" : "the name",
    "floatPrimitiveVal" : 4.380000114440918,
    "floatVal" : 5.059999942779541,
    "lastName" : "smith",
    "version" : 0

对于基元 byte 和 float 以及 Byte 和 Float 值,它们作为正确的数字类型而不是作为字符串插入到数据库中。我确实注意到,如果您使用def 定义域对象中的字段,则该字段根本不会持久化,我认为它使用字段类型来确定如何将其转换为 MongoDB 所需的 BSON 表示。

因此,总而言之,我认为您不需要编写自定义编组器,我相信这与您定义域对象的方式有关。

【讨论】:

以上是关于Grails Mongo GORM 插件 - 浮点和字节的映射是字符串而不是数字的主要内容,如果未能解决你的问题,请参考以下文章

在 grails 中迁移 mongodb 插件时发生异常

GORM 无法实现插件中的域类是 GORM 类

Grails GORM MongoDB。父模型类的问题

在Grails外部使用GORM时,找不到会话错误

Grails 数据库迁移 - dbm-gorm-diff 不起作用

Grails + GORM:GORM 中默认的 equals() 实现是啥?