gpt4 book ai didi

mongodb - POGO到Mongo DBObject

转载 作者:行者123 更新时间:2023-12-02 14:33:31 24 4
gpt4 key购买 nike

抱歉,这是Grails和Mongo的新手问题,因为我很困惑。

我有一个带有嵌套结构的POGO(非Domain类),需要将其存储在MongoDB中。我有下面的示例代码,但这只会生成顶级对象的属性图,并且由于嵌套的Name对象而导致插入失败

class Name {
String firstName
String lastName
}

class Details {
Name name
String street
String city
String postcode

Name[] siblings
}

// Get only the properties we want to save
def dbObject = details.properties.findAll { !['class', 'metaClass'].contains(it.key) }

// Insert it into the details collection
db.details.insert(dbObject)

然后,我尝试了此示例代码答案 Grails JSONBuilder,但得到了以下堆栈跟踪
org.apache.commons.lang.UnhandledException: org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Unconvertable Object of class: java.util.LinkedHashMap
at org.codehaus.groovy.grails.web.converters.AbstractConverter.toString(AbstractConverter.java:112)
at grails.converters.JSON.toString(JSON.java:232)
at grails.converters.JSON$toString.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at JSONSerializer.getJSON(JsonSerializer.groovy:21)

最佳答案

您可以在BootStrap.groovy中为您的类注册自定义JSON marshaller。

def init = { servletContext ->

def NameMarshaller = { Name it ->
[firstName:it.firstName, lastName:it.lastName]
}

def DetailsMarshaller = { Details it->
[name:it.name,...,siblings:it.siblings]
}


JSON.registerObjectMarshaller(Name, NameMarshaller)
JSON.registerObjectMarshaller(Details, DetailsMarshaller)
...
}

在您的应用中,只需执行
db.details.insert(detailsObject as JSON)

在marshallers中注册的父级和子级中的属性将被保留,因为不会列出“class”和“metaClass”,因此不会保留它们,您可以在代码中保存属性过滤行。自定义编码人员只需将您的POGO转换为 map 即可。

关于mongodb - POGO到Mongo DBObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20107285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com