【发布时间】:2013-03-15 14:27:09
【问题描述】:
我最近开始使用 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 的问题。 非常感谢任何帮助。
在此先感谢:)
【问题讨论】:
-
我没有使用过 Morphia/Grails,但我使用过 Grails 和 Mongo (Gorm)...您看起来字符串/ObjectId 不匹配。 Customer.get() 接受字符串还是 ObjectId?
-
它需要一个 ObjectId,但是当您使用 domain.get() 时,这并不重要,最奇怪的是,相同的代码适用于 CustomerA。这很奇怪
-
如果它是你所说的,即不匹配的字符串/对象 ID,它不应该适用于任何其他客户对象.. 但这确实有效!
标签: mongodb grails groovy morphia