2012-11-13 25 views
6

Mam hierarchii klasy zaprojektowany dla powiadomień sklep użytkowników:MongoDB: zapytanie o @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> { 
} 

    ... 

Jest to przydatne dla powracających polimorficzne tablice, pozwalając mi do przechowywania wszelkiego rodzaju danych w polu „tag”. Problem zaczyna się, gdy owinięte obiektów zawiera @DBRef pola:

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

Zapytania na polach „tag” działa dobrze:

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

ale muszę zapytać na polach JetAnotherClass (dwa poziomy pól @DBRef). Próbowałem z notacji dot, a także z podobiektów ale zwraca wartość null:

Dot notacji:

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

podobiektów:

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

pomocy? Z góry dziękuję!

Odpowiedz

7

Ponieważ wyglądasz jakbyś odpytywanie tylko _id Wierzę, że można zrobić:

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

Jednakże:

Ale muszę zapytać na polach JetAnotherClass (dwa poziomy @ Pola DBRef).

DBRefs nie sprzężeń, są one jedynie własnym opisując _id w przypadku, gdy nie wiem kolekcję łączącą Stworzy to obiekt pomocniczy, dzięki czemu nie trzeba kodować ten sam po stronie klienta.

można znaleźć więcej na DBRefs tutaj: http://docs.mongodb.org/manual/applications/database-references/

Zasadniczo można wyszukać pól podrzędnych wewnątrz DBRef z tego samego dokumentu, tj: DBRef.$_id ale nie można, po stronie serwera, rozwiąż że DBRef i zapytania w sprawie pola wynikowe.

+0

OK, wygląda na to, że popełniłem błąd koncepcyjny. Czy istnieje sposób rozwiązania tego problemu z klienta Java? – Roi

+1

@Roi Jedynym sposobem na ręczne rozwiązanie strony klienta JOINs jest dość standardowy na wszystkich platformach: http://stackoverflow.com/questions/4067197/mongodb-and-joins – Sammaye

Powiązane problemy