Conforme mencionado em outras respostas, o MongoDB não permite caracteres $
ou .
como chaves de mapa devido a restrições nos nomes de campo . No entanto, conforme mencionado em Dollar Sign Operator Escaping esta restrição não o impede de inserir documentos com tais chaves, apenas impede que você os atualize ou consulte.
O problema de simplesmente substituir .
por [dot]
ou U+FF0E
(conforme mencionado em outra parte desta página) é, o que acontece quando o usuário deseja legitimamente armazenar a chave [dot]
ou U+FF0E
?
Uma abordagem que o driver afMorphia do Fantom adota é usar sequências de escape Unicode semelhantes às do Java, mas garantindo que o caractere de escape seja escapado primeiro. Em essência, as seguintes substituições de string são feitas (*):
\ --> \\
$ --> \u0024
. --> \u002e
Uma substituição reversa é feita quando as chaves do mapa são lidas subsequentemente no MongoDB.
Ou no código Fantom :
Str encodeKey(Str key) {
return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")
}
Str decodeKey(Str key) {
return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")
}
O único momento em que o usuário precisa estar ciente dessas conversões é ao construir consultas para essas chaves.
Visto que é comum armazenar dotted.property.names
em bancos de dados para fins de configuração, acredito que essa abordagem seja preferível a simplesmente banir todas essas chaves de mapa.
(*) afMorphia realmente executa regras de escape unicode completas / adequadas, conforme mencionado na sintaxe de escape Unicode em Java, mas a sequência de substituição descrita funciona da mesma forma.