0

最近、grails を使い始めましたが、すばらしいです。私のアプリケーションでは、mongodb と通信するために morphia プラグインを使用しています。システムの概要を説明してから、私が直面している問題に取り掛かりましょう

概要 次の 3 つのドメイン クラスがあります。

A. Project.groovy
B. Customer.groovy
C. User.groovy

Project.groovy には次のようなものがあります

@Reference Customer customer
String projectName
@Id ObjectId projectId

Customer.groovy には次のようなものがあります

@Reference List<Project> projects
String customerName
@Id ObjectId customerId

User.groovy には次のようなものがあります

@Reference List<Project> userResponsibleProjects
String userName
@Id String userEmail

問題をより明確に説明できるように、いくつかのサンプルデータ。

customers -> customerA and customerB
projects -> projectA, ProjectB and projectC
projectA and projectB has reference to customerA and vice versa
projectC has reference to customerC and vice versa
Users -> userA and userB
userA has reference to projectA and projectB.
userB has reference to projectC

ここで、問題とその問題がどのように発生したかについての情報をいくつか示します。システム外のユーザーには、使用しなくなったプロジェクトを削除するオプションがあります。そのため、プロジェクトの削除がトリガーされると、そのプロジェクトへの参照を削除して顧客を保存し、顧客の保存が成功した場合はプロジェクトを削除します。私は新しいので、User.groovy のプロジェクト参照を確認しませんでした。projectB を削除するとします。

customer.remove(projectB)
if(customer.save())
    projectB.remove()

今、私が直面していた最初の問題は

「grails 例外が user.userResponsibleProjects のプロジェクト参照を取得できませんでした」。これを解決するために、データベースにアクセスして次のことを行いました

db.User.update({_id: userA},{$pull: {$ref: "Project", $id: ObjectId("projectB")}})

そしてそれはうまくいきました。今、本当の問題。

ユーザーがいずれかの顧客にアクセスしようとすると、システムは同じ例外をスローします。

Customer customer = Customer.get(params.customerId)

mongodb に同じ ID を持つ顧客ドキュメントがあっても失敗します。

しかし、私が次のようなことをすると、

Customer customer = Customer.list().toList().find { it.id.toString() == params.customerId}

できます。

なぜこれが起こっているのですか?これがmongodbの問題なのか、morphiaの問題なのかはわかりません。どんな助けでも大歓迎です。

前もって感謝します :)

4

1 に答える 1