2012-11-13 210 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