2012-11-13 19 views
6

ich eine Klassenhierarchie für Speichern von Benutzerbenachrichtigungen entworfen haben:MongoDB: Abfrage von @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> { 
} 

    ... 

Dies ist nützlich für polymorphe Arrays Rückkehr, so dass ich jede Art von Daten, die in dem „Tag“ Feld zu speichern. Das Problem beginnt, wenn die verpackten Objekte @DBRef Felder enthält:

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

Abfragen auf den Bereichen „tag“ funktioniert:

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

Aber ich brauche auf den Bereichen JetAnotherClass (zwei Ebenen abfragen von @DBRef-Feldern). Ich habe mit Punktnotation versucht und auch mit Subobjekte aber es gibt null zurück:

Dot Notation:

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

Subobjekte:

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

Hilfe? Vielen Dank im Voraus!

Antwort

7

Da Sie aussehen wie Sie abfragen, nur von _id Ich glaube, Sie tun können:

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

jedoch:

Aber ich brauche auf den Bereichen JetAnotherClass (in zwei Stufen abzufragen @ DBRef-Felder).

DBRefs sind nicht JOIN, sie sind nur ein selbst _id im Fall beschreibt, dass Sie die Verknüpfung Sammlung nicht wissen, dass es ein Helfer-Objekt erstellen, so müssen Sie dies nicht codieren, sich auf der Client-Seite.

Sie können mehr über DBRefs finden Sie hier: http://docs.mongodb.org/manual/applications/database-references/

Grundsätzlich können Sie die Unterfelder innerhalb des dBref aus demselben Dokument abfragen, das heißt: DBRef.$_id aber Sie können nicht, serverseitige, lösen, dass dBref und Abfrage auf die resultierende Felder.

+0

Ok, es scheint, ich habe einen konzeptionellen Fehler gemacht. Gibt es eine Möglichkeit, dies vom Java-Client zu lösen? – Roi

+1

@Roi Die einzige Möglichkeit ist, die JOINs-Client-Seite manuell aufzulösen, es ist ziemlich Standard für alle Plattformen: http://StackOverflow.com/questions/4067197/mongodb-and-joins – Sammaye