【问题标题】:unable to use domain.get() after updating mongodb document from mongoShell从 mongo Shell 更新 mongodb 文档后无法使用 domain.get()
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 看看我的另一篇关于如何解决这个问题的帖子here
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2020-09-26
  • 2017-06-21
  • 2018-06-19
  • 2021-07-20
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多