2012-10-08 20 views
9

Muszę przechowywać klasę Scala w Morphii. Z adnotacji to działa dobrze, dopóki nie próbują sklepu kolekcji _ <: Oznaczenie liczbyScala, Morphia i wyliczenie

Morphia skarży się, że nie ma serializers dla tego typu, i zastanawiam się, jak zapewnić jeden. Na razie zmieniłem typ kolekcji na Seq [String] i wypełniam ją, wywołując toString dla każdego przedmiotu w kolekcji.

To działa dobrze, ale nie jestem pewien, czy to prawda.

+1

Co dokładnie masz na myśli przez "kolekcję' _ <: Enumeration "? Masz na myśli 'Seq [_ <: Enumeration]' (który jest taki sam jak 'Seq [Enumeration]', chyba że 'Seq' jest zmienny), czy masz na myśli coś innego? –

+1

Sequ of ** A extends Enumeration ** – jdevelop

+0

Czy próbowałeś użyć 'A.Value' zamiast' A.type'? Czy błędnie interpretuję cel "Seq"? –

Odpowiedz

1

Ten problem jest wspólny dla kilku dostępnych warstw abstrakcji na szczycie MongoDB. Wszystko powraca do podstawowego powodu: nie ma ekwiwalentu enum w json/bson. Salat na przykład ma ten sam problem.

W rzeczywistości kierowca MongoDB Java nie obsługuje teksty stałe jak można przeczytać w dyskusji dzieje tutaj: https://jira.mongodb.org/browse/JAVA-268, gdzie można zobaczyć, że problem jest nadal otwarty. Większość frameworków, w których widziałem używanie MongoDB z Javą, nie implementuje funkcjonalności niskiego poziomu, takich jak ta. Myślę, że wybór ten ma wiele sensu, ponieważ pozostawiają ci wybór, jak radzić sobie ze strukturami danych, które nie są obsługiwane przez sterownik niskiego poziomu, zamiast narzucać ci, jak to zrobić.

Ogólnie uważam, że brak wsparcia nie pochodzi z ograniczeń technicznych, ale raczej z wyboru projektu. W przypadku wyliczeń istnieje wiele sposobów mapowania ich za pomocą ich zalet i wad, podczas gdy inne typy danych są prawdopodobnie prostsze. Nie znam sterownika Java MongoDB, ale myślę, że obsługa wielu "trybów" wymagałaby refaktoryzacji (może dlatego mówią o nowej wersji serializacji?)

To są dwie strategie, którymi jestem myślenie o:

  • Jeśli chcesz indeksu na wyliczenia i minimalizacji zajmowanej przestrzeni, będzie mapować enum do liczby całkowitej (nie używając porządkowa, proszę can set enum start value in java).
  • Jeśli problemem jest queryability na mongoshell, ponieważ Twoje dane będą dostępne przez naukowca danych, należy raczej zapisać enum używając jego wartość ciągu

Podsumowując, nie ma nic złego w dodaniu danych pośrednią struktura między twoim natywnym obiektem a MongoDB. Salat wspiera go poprzez CustomTransformers, na Morphie może trzeba będzie koniecznie dokonać konwersji. Idź po to.