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.namesw 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.