2013-03-15 48 views
0

我最近開始使用grails,它很棒。在我的應用程序中,我使用morphia插件與mongodb進行通信。讓我給你的系統的概述,然後進入我面對從mongoShell更新mongodb文檔後​​無法使用domain.get()

概述 這個問題我有三個域類如下

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中的項目引用。所以說,我們刪除項目B,我做

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和進一步調查,我發現以下無法獲得參考,我得到客戶選擇使用

蒙戈
Customer customer = Customer.get(params.customerId) 

即使在mongodb中存在具有相同ID的客戶文檔,也會失敗。

但如果我這樣做,

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

它的工作原理。

任何想法爲什麼會發生這種情況?我不確定這是否是mongodb或morphia的問題。 任何幫助,不勝感激。

感謝提前:)

+0

我沒有使用Morphia/Grails,但我曾與Grails和Mongo(Gorm)...你看起來有一個String/ObjectId不匹配。 Customer.get()採用字符串還是ObjectId? – 2013-03-15 14:45:41

+0

它需要一個ObjectId,但是當你使用domain.get()時,它並不重要,最奇怪的是,相同的代碼適用於CustomerA。這是奇怪的 – Pazuzu 2013-03-15 15:04:39

+0

如果這是你在說我,E,不匹配字符串/對象ID它不應該爲任何其他客戶對象工作..但這是! – Pazuzu 2013-03-15 15:06:51

回答

0

我發現這個問題,幾個小時的調試後:),問題是有在蒙戈刪除交叉參考文件,如果您有任何副本這通常發生該對象參考了mongo中的其他文檔。爲了避免這個問題,確保沒有副本,如果確定它們是嵌入的或引用的副本。

+0

看看我的另一篇文章如何糾正這個問題[這裏](http://stackoverflow.com/questions/16414872/updating-nested-emdedded-list-containing-basicdbobject-to-dbref-in-mongodb-using) – Pazuzu 2013-05-15 12:34:21