从mongo Shell更新mongodb文件后无法使用domain.get()

时间:2013-03-15 14:27:10

标签: mongodb grails groovy morphia

我最近开始使用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")}})

这很有效。现在真正的问题。

如果用户试图进入任何一个客户,系统会抛出同样的异常i,e,无法获得user.userResponsibleProjects的参考,并且在进一步调查后我发现以下内容,我从mongo中选择了客户

Customer customer = Customer.get(params.customerId)
即使在mongodb中存在具有相同ID的客户文档,

也会失败。

但如果我这样做,

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

它有效。

知道为什么会这样吗?我不确定这是mongodb或morphia的问题。 非常感谢任何帮助。

先谢谢:)

1 个答案:

答案 0 :(得分:0)

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