mongodb - 如何在 MongoDB GORM 中支持嵌入 map (具有自定义值类型)?

标签 mongodb grails grails-orm

我想要一个由 map 引用的嵌入文档(如下面的“A 类”)。环境是Grails + GORM + MongoDB。

这可能吗?如果可以,如何实现?

class A { // fails with IllegalArgumentException occurred when processing request: can't serialize class X in line 234 of org.bson.BasicBSONEncoder
    static mapWith = "mongo"
    Map<String, X> map = new HashMap<String, X>()
}

class B { // works
    static mapWith = "mongo"
    List<X> list = new ArrayList<X>()
}

class C { // works with primitive type values
    static mapWith = "mongo"
    Map<String, String> map = new HashMap<String, String>()
}

class X {
    String data

    public X(String data) {
        this.data = data
    }
}

最佳答案

正如 Art Hanzel 所建议的那样,嵌入效果非常好。

但是您的问题来自于您尝试使用列表通用性作为一种约束的事实:

Map<String, X>

问题是 Grails 无法很好地处理这种语法,首先是因为 Groovy doesn't support genericity .

但是,MongoDB 插件提供了非常强大的功能,可以让您将自定义类型定义为域类属性:see here .

就你的情况而言,你可以有

class A {
    static mapWith = "mongo"
    MyClass map = new MyClass()
}

然后在你的 src/java 中,例如你可以实现一个

class MyClass extends HashMap<String,X> { }

然后,当然,你必须定义一个特殊的 AbstractMappingAwareCustomTypeMarshaller 来指定如何在 DB 中读写属性。

另一个步骤还可以是向 A 类添加自定义验证器来检查数据的有效性...

关于mongodb - 如何在 MongoDB GORM 中支持嵌入 map (具有自定义值类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921985/

相关文章:

grails - 创建简单的插入表单时,Grails字段插件如何工作?

postgresql - 使用 grails "POSTGRESQL-EXTENSIONS"json 类型时出现休眠错误

javascript - Spring Security Core 和确认密码字段的自定义验证器是否可行?

grails - Grails转发参数列表

javascript - 更新时如何对标签数组进行排序?

spring - 无法获取 MongoDbConnectionException : Failed to authenticate to database

mongodb - GORM 查询多个集合

grails - GORM mongodb 映射到现有集合结构

node.js - Mongodb 基于具有计数的唯一子集合属性聚合搜索结果?

node.js - MongoDB 查询返回 null,即使它在从 mlab 迁移到 mongoDB atlas 后在集合中可用