0

我最近开始使用 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 的问题。任何帮助是极大的赞赏。

提前致谢 :)

4

1 回答 1

0

经过数小时的调试,我发现了问题:),问题是在 mongo 中存在对已删除文档的交叉引用,如果您有任何对象的副本,通常会发生这种情况,该对象引用了 mongo 中的其他文档。为避免此问题,请确保没有副本,如果有,请确保它们是嵌入的或引用的副本。

于 2013-05-06T15:45:40.580 回答