2012-11-13 261 views
6

我有一個類層次結構設計爲存儲用戶通知:的MongoDB:查詢通過@DBRef

@Document 
public class Notification<T> { 
    @Id 
    private String id; 
    @DBRef 
    private T tag; 
    ... 
} 

@Document 
public class NotificationA extends Notification<WrappedA> { 
} 

@Document 
public class NotificationB extends Notification<WrappedB> { 
} 

    ... 

這是返回多態性陣列,讓我任何類型的數據存儲在「標籤」領域是有用的。

@Document 
public class WrappedA { 
    @Id 
    private String id; 
    @DBRef 
    private JetAnotherClass referenced; 
    ... 
} 

查詢的「標籤」的領域工作得很好:

db.NotificationA.find({"tag.$id": ObjectId("507b9902...32a")}) 

但我需要在JetAnotherClass領域查詢(兩個級別,當包裝的對象包含@DBRef領域的問題開始@DBRef字段)。我試着點符號,並與子對象,但它返回null:

點標記:

db.NotificationA.findOne({"tag.$referenced.$id": ObjectId("508a7701...29f")}) 

子對象:

db.NotificationA.findOne({"tag.$referenced": { "_id": ObjectId("508a7701...29f") }}) 

任何幫助嗎? 在此先感謝!

回答

7

既然你看起來像你只_id查詢我相信你能做到:

db.NotificationA.findOne({"tag.$id": ObjectId("blah")}); 

但是:

但我需要在JetAnotherClass的兩個級別的字段(查詢@ DBRef字段)。

是DBREFS不連接,它們僅僅是在你不知道的鏈接集合,它將創建一個輔助對象,所以您不必到這個自己的客戶端代碼的事件描述_id自我。

你可以找到更多關於DBREFS這裏:http://docs.mongodb.org/manual/applications/database-references/

基本上你可以從同一文檔查詢DBREF內的子領域,即:DBRef.$_id但你不能,服務器端,解決DBREF和查詢上產生的領域。

+0

好吧,我似乎犯了一個概念錯誤。有沒有辦法從Java客戶端解決這個問題? – Roi

+1

@Roi唯一的方法是手動解析JOINs客戶端,它在所有平臺上都是非常標準的:http://stackoverflow.com/questions/4067197/mongodb-and-joins – Sammaye