list - 如何在Grails下使用MongoDB存储嵌入文档的列表?

标签 list mongodb grails documents

我在使用Grails MongoDB插件在MongoDB中存储嵌入式文档/对象列表时遇到问题。我使用了第3章documentation中给出的信息,但只嵌入了一个有效的对象。

为了进行测试,我在一个新的Grails项目中创建了两个域对象Person和Address。他们看起来像这样:

class Person {
    ObjectId id
    String   firstName
    String   lastName
    Address  address
    List     otherAddresses = []
    static embedded = ['address', 'otherAddresses']
}

class Address {
    String street
    String postCode
    String city
}

当我在Bootstrap.groovy中执行以下行时,它在MongoDB中存储了两个Person对象-都具有正确的地址,但在person1中otherAddresses列表是“[null]”,在person2中otherAddresses列表是“[{“street”:“第二街道。 164“,” city“:” New York“,” postCode“:” 13579“}]”
def address = new Address(street: "Mainstreet. 164", city: "New York", postCode:"12345")
def person1 = new Person(firstName: "John", lastName: "Doe")
person1.address = address
person1.otherAddresses.add(address)
println person1.otherAddresses // Result: "[mongoembeddedlisttest.Address : (unsaved)]"
person1.save()
person1.errors.allErrors.each { println it } // no errors

def person2 = new Person(firstName: "Jane", lastName: "Doe")
person2.otherAddresses += ['street': 'Second Street. 164', 'city': 'New York', 'postCode':'13579']
println person2.otherAddresses // Result: "[[street:Second Street. 164, city:New York, postCode:13579]]"
person2.save()

结果数据库条目:
{ "_id" : { "$oid" : "521089461a150b20390d61c2"} , "address" : { "city" : "New York" , "postCode" : "12345" , "street" : "Mainstreet. 164"} , "firstName" : "John" , "lastName" : "Doe" , "otherAddresses" : [  null ] , "version" : 0}
{ "_id" : { "$oid" : "521089461a150b20390d61c3"} , "firstName" : "Jane" , "lastName" : "Doe" , "otherAddresses" : [ { "street" : "Second Street. 164" , "city" : "New York" , "postCode" : "13579"}] , "version" : 0}

附加说明:
  • 我正在使用纯mongodb方法(不能与Hibernate混合使用)
  • 我正在使用运行Mongo db 2.4.4的Grails 2.2.1的Windows 8计算机上工作
  • Person是/ grails-app / domain中的域对象,而Address是/ src / groovy中的“常规” groovy类(我可以将其放在域文件夹中,但无效)
  • 在Config.groovy中,所有内容均设置为可空:grails.gorm.default.constraints = {'*'(nullable:true)}
  • BuildConfig.groovy具有插件条目:编译“:mongodb:1.3.0”

  • 我究竟做错了什么?如何使用Grails机制存储嵌入式对象列表?

    最佳答案

    我认为您是在第二人称而不是Address对象中添加 map 。您为什么要为每个人添加不同的otherAddress吗?

    我认为这应该有效,尽管我尚未测试过:

    def address = new Address(street: "Mainstreet. 164", city: "New York", postCode:"12345")
    def person1 = new Person(firstName: "John", lastName: "Doe")
    person1.address = address
    person1.otherAddresses.add(address)
    println person1.otherAddresses // Result: "[mongoembeddedlisttest.Address : (unsaved)]"
    person1.save()
    person1.errors.allErrors.each { println it } // no errors
    
    def person2 = new Person(firstName: "Jane", lastName: "Doe")
    person2.otherAddresses += new Address('street': 'Second Street. 164', 'city': 'New York', 'postCode':'13579')
    println person2.otherAddresses 
    person2.save()
    

    关于list - 如何在Grails下使用MongoDB存储嵌入文档的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18297618/

    相关文章:

    javascript - 默认情况下Grails 3.0 HTML表更改输入按钮

    C# 任意嵌套列表

    c - 为什么我在这个列表中得到垃圾值

    java - 列表中项目的随机分布,具有确切的出现次数

    javascript - 热重载期间识别的模型,仅在服务器重新启动后失败

    mongodb - Non-relational db,哪个才是正确的选择

    mongodb - 为什么我在Mongodb3.4文本搜索中无法进行排序操作

    Grails 内联插件 : Cannot Upgrade a plugin that is configured via BuildConfig. groovy

    java - Grails 2.0.4 打开 zip 文件时出错或缺少 Springloaded 的 JAR list

    python - 子列表到编号