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ć.
Dzięki Oliver Ja wzbudzę bilet gdybym wymyślić dobre rozwiązanie. – ltfishie
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
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 ". –