Jak wspomniano w innych odpowiedziach, MongoDB nie zezwala na znaki $
lub .
jako klucze mapowania ze względu na ograniczenia dotyczące nazw pól . Jednak, jak wspomniano w sekcji Operator znaku dolara, uniknięcie tego ograniczenia nie zapobiega wstawianiu dokumentów z takimi kluczami, a jedynie zapobiega ich aktualizowaniu lub odpytywaniu.
Problem po prostu zastępując .
z [dot]
lub U+FF0E
(jak wspomniano w innym miejscu na tej stronie) jest to, co się dzieje, gdy użytkownik chce legalnie przechowywania klucza [dot]
lub U+FF0E
?
Podejściem, które stosuje sterownik afMorphia Fantoma , polega na użyciu sekwencji ucieczki Unicode podobnych do tej w Javie, ale najpierw należy upewnić się, że znak ucieczki jest unikany. Zasadniczo dokonywane są następujące zamiany ciągów (*):
\ --> \\
$ --> \u0024
. --> \u002e
Odwrotna zamiana jest wykonywana, gdy klucze map są następnie odczytywane z MongoDB.
Lub w kodzie Fantoma :
Str encodeKey(Str key) {
return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")
}
Str decodeKey(Str key) {
return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")
}
Jedynym przypadkiem, w którym użytkownik musi być świadomy takich konwersji, jest tworzenie zapytań dla takich kluczy.
Biorąc pod uwagę, że przechowywanie dotted.property.names
w bazach danych do celów konfiguracyjnych jest powszechne, uważam, że takie podejście jest lepsze niż po prostu blokowanie wszystkich takich kluczy map.
(*) afMorphia faktycznie wykonuje pełne / poprawne reguły ucieczki unicode, jak wspomniano w składni ucieczki Unicode w Javie, ale opisana sekwencja zamiany działa równie dobrze.