2012-05-02 15 views
5

W Spring-Data można użyć adnotacji @Document, aby określić kolekcję do zapisania obiektu. Powiedzmy, że mam dwie klasy, Studenta i Nauczyciela, które przetrwały w zbiorach ludzi. Po wykonaniu następującego kodu:Mongodb wiosennych danych kwerendy z wieloma klasami przechowywanymi w tej samej kolekcji

mongo.find(new Query(), Teacher.class); 

wynik zawiera zarówno uczeń, jak i nauczyciel. Patrząc na dane utworzone przez Spring-Data, każdy dokument zawiera pole "_class", które wskazuje, z której klasy jest utrwalony.

To pole nie jest używane jako filtr, który zwraca tylko nauczyciel? Jak mogę zapytać tylko o nauczyciela innego niż to:

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class); 

Odpowiedz

1

To jest mniej więcej kwestia, jak zaprojektować swoje kolekcje. Ponieważ Mongo nie wie nic o typach, musimy dodać dodatkowe metadane, aby móc odróżnić dokumenty od siebie nawzajem. Dlatego podczas wysyłania zapytań musisz dodać te ograniczenia również do kwerendy. Zauważ, że możesz odwołać się do klucza _class przez DefaultMongoTypeMapper.DEFAULT_TYPE_KEY.

Myśleliśmy o dodanie kilku API do zapytania wyrazić jednym tylko chce uzyskać dokumenty danego typu jak ten:

mongo.find(new Query(Teacher.class), Teacher.class); 

to nadal czuje się nieco dziwne, że masz do klasy domeny państwowej dwukrotnie (co ma sens, jeśli chcesz ograniczyć wyniki do dokumentów danego typu, ale zamapuj je na inną klasę). Poza tym mogliśmy ograniczyć wyniki tylko do dokumentów, które noszą dokładnie ten typ, ponieważ typy są przechowywane jako łańcuchy znaków, a dziedziczenie może być zastosowane tylko wtedy, gdy klasa została już załadowana. Dlatego przy wyszukiwaniu dokumentów o typie Person najpierw musimy załadować wszystkie dokumenty, spróbować sprawdzić typ, wykonać sprawdzenie typu i potencjalnie wyrzucić wynik, który jest nieoptymalny ze względu na wydajność.

Inną opcją będzie przechowywanie wszystkich typów, do których można przypisać klasę (w zasadzie wszystkie interfejsy i klasy ponadnormatywne z wyjątkiem Object), ale to spowoduje zapisanie całkiem dużej ilości danych. Można to z kolei zbliżyć, dodając flagę do adnotacji @Document.

Podsumowując: obecnie nie ma innego sposobu, ale nie wahaj się podnieść biletów JIRA, jeśli masz sugestie, jak to poprawić.

+0

Dzięki Oliver Ja wzbudzę bilet gdybym wymyślić dobre rozwiązanie. – ltfishie

+0

Przechodząc przez mononom Jira, natknąłem się na ten bilet https://jira.springsource.org/browse/DATAMONGO-128, który jest rynkiem tak samo jak 1.0.M3. Czy to nadal jest w źródle? – ltfishie

+0

Tak, ale to nie dotyczy Twojego scenariusza. Bilet obejmuje możliwość przechowywania "Osoby" i "Nauczyciela" w tym samym zbiorze oraz możliwość odpytywania z niego obiektów i uzyskania instancji "Osoba" i "Nauczyciel" (stąd potrzebna informacja o typie). W rzeczywistości nie jest to zgodne ze scenariuszem "tylko czytaj" dla nauczycieli ". –

1

jest to najlepsze rozwiązanie dla tego pytania:

query.restrict(Teacher.class,Teacher.class); 
+3

Więcej szczegółowych informacji na temat sugerowanej odpowiedzi byłoby bardzo pomocne dla OP – Hawk

+0

Idealne, dzięki. –

Powiązane problemy