1

Grails MongoDB プラグインを使用して、埋め込まれたドキュメント/オブジェクトのリストを MongoDB に保存する際に問題が発生しています。第 3 章のドキュメントに記載されている情報を使用しましたが、1 つのオブジェクトの埋め込みしか機能しませんでした。

テスト目的で、新しい Grails プロジェクトに 2 つのドメイン オブジェクト 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 に 2 つの Person オブジェクトが格納されます。どちらも正しいアドレスを持っていますが、person1 の otherAddresses リストは "[ null ]" で、person2 の otherAddresses リストは "[ { "street" : " です。 2つ目の通り。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とのハイブリッドではありません)

  • 私はmongo db 2.4.4を実行しているGrails 2.2.1を使用してWindows 8マシンで作業しています

  • Person は /grails-app/domain のドメイン オブジェクトであり、Address は /src/groovy の「通常の」groovy クラスです (ドメイン フォルダーに配置できますが、効果はありません)。

  • Config.groovy ではすべてが null 許容に設定されています: grails.gorm.default.constraints = { '*'(nullable: true) }

  • BuildConfig.groovy にはプラグイン エントリがあります: compile ":mongodb:1.3.0"

私は何を間違っていますか?Grails メカニズムを使用して埋め込みオブジェクトのリストを保存するにはどうすればよいですか?

4

1 に答える 1

0

Address オブジェクトではなく、2 人称でマップを追加していると思います。人ごとに異なる 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 に答える