To mniej więcej kwestia tego, jak zaprojektować swoje kolekcje. Ponieważ Mongo nie wie nic o typach, musimy dodać dodatkowe metadane, aby móc odróżnić dokumenty od siebie. Dlatego podczas wykonywania zapytań będziesz musiał również dodać te ograniczenia do zapytania. Zauważ, że możesz odwołać się do _class
wprowadź klucz przez DefaultMongoTypeMapper.DEFAULT_TYPE_KEY
.
Pomyśleliśmy o dodaniu API do zapytania, aby wyrazić, że tylko chce się pobrać dokumenty danego typu:
mongo.find(new Query(Teacher.class), Teacher.class);
Nadal wydaje się trochę dziwne, że musisz dwukrotnie określić klasę domeny (co ma sens, jeśli chcesz ograniczyć wyniki do dokumentów danego typu, ale mapować je na inną klasę). Poza tym mogliśmy ograniczyć wyniki tylko do dokumentów, które zawierają dokładnie to type, ponieważ typy są przechowywane jako ciągi, a dziedziczenie można zastosować tylko wtedy, gdy klasa została już załadowana. Więc podczas zapytania o dokumenty z typem Person
musielibyśmy załadować wszystkie najpierw spróbuj wyszukać typ, sprawdź typ i potencjalnie odrzuć wynik, który jest nieoptymalny ze względu na wydajność.
Inną opcją byłoby przechowywanie wszystkich typów, do których można przypisać klasę (prawie wszystkie interfejsy i nadklasy z wyjątkiem Object
być może), ale spowodowałoby to przechowywanie dużej ilości danych. Można do tego z kolei podejść, dodając flagę do @Document
adnotacja.
Konkluzja:obecnie nie ma innego sposobu, ale możesz podnieść zgłoszenia JIRA, jeśli masz sugestie, jak można to poprawić.