2013-08-18 4 views
1

У меня возникли проблемы с хранением списков встроенных документов/объектов в MongoDB с использованием плагина Grails MongoDB. Я использовал информацию, указанную в documentation в главе 3, но получил только вложение одного объекта.Как хранить списки встроенных документов с помощью MongoDB под Grails?

Для целей тестирования я создал два объекта домена Person и Address в новом проекте Grails. Они выглядят так:

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 он хранит два объекта Person в MongoDB - оба имеют правильный адрес, но в person1 Перечень otherAddresses является «[пустой]» и в person2 в списке другихAddresses «[{« улица »:« Вторая улица ». 164" , "город": "Нью-Йорк", "Почтовый индекс": "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)

  • Я работаю над машиной Windows 8 используя Grails 2.2.1 running mongo db 2.4.4

  • Лицо является объектом домена в/grails-app/domain и адресом является «нормальным» класс groovy в/src/groovy (я могу поместить его в папку домена но это не имеет никакого эффекта)

  • Все готово быть обнуляемым в Config.groovy: grails.gorm.default.constraints = { '*' (обнуляемым: правда)}

  • BuildConfig.groovy имеет плагин: компиляция ": mongodb: 1.3.0"

Что я делаю неправильно? Как сохранить список внедренных объектов с помощью механизма Grails?

ответ

0

Я думаю, вы добавляете карту во втором человеке вместо объекта Address. Есть ли причина, по которой вы добавляете другойAddress для каждого человека?

Я думаю, что это должно работать, хотя я не проверял:

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()