我最近开始使用 grails,它很棒。在我的应用程序中,我使用 morphia 插件与 mongodb 进行通信。让我给你一个系统的概述,然后进入我面临的问题
概述我有三个域类,如下所示
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
现在有一些关于这个问题的信息以及这个问题是如何产生的。out 系统的用户可以选择删除他们不再使用的项目。因此,当触发删除项目时,我删除对该项目的引用并保存客户,如果客户保存成功,我将删除该项目。因为我是新人,所以我没有检查 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")}})
那行得通。现在真正的问题。
如果用户尝试进入任何客户,系统会抛出相同的异常,即无法获得 user.userResponsibleProjects 的参考,并且在进一步调查中我发现以下内容,我使用 mongo 获得了选定的客户
Customer customer = Customer.get(params.customerId)
即使在 mongodb 中有一个具有相同 id 的客户文档,它也会失败。
但如果我做类似的事情,
Customer customer = Customer.list().toList().find { it.id.toString() == params.customerId}
有用。
知道为什么会这样吗?我不确定这是 mongodb 还是 morphia 的问题。任何帮助是极大的赞赏。
提前致谢 :)