1

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

出于测试目的,我在一个新的 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" : "纽约" , "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 机制存储嵌入对象的列表?

4

1 回答 1

0

我认为您正在以第二人称添加地图而不是 Address 对象。你有什么理由为每个人添加不同的 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()
于 2013-08-19T08:31:53.360 回答