【问题标题】:How to store lists of embedded documents with MongoDB under Grails?如何在 Grails 下使用 MongoDB 存储嵌入式文档列表?
【发布时间】:2013-08-20 07:04:20
【问题描述】:

我在使用 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 有插件入口:compile ":mongodb:1.3.0"

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

【问题讨论】:

    标签: list mongodb grails documents


    【解决方案1】:

    我认为您在第二人称中添加地图而不是地址对象。您是否有任何理由为每个人添加不同的 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()
    

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多