Como se menciona en otras respuestas, MongoDB no permite $
o .
caracteres como claves de mapa debido a restricciones en los nombres de campo . Sin embargo, como se menciona en Operador de signo de dólar, escapar de esta restricción no le impide insertar documentos con dichas claves, solo le impide actualizarlos o consultarlos.
El problema de simplemente reemplazar .
con [dot]
o U+FF0E
(como se mencionó en otra parte de esta página) es, ¿qué sucede cuando el usuario legítimamente quiere almacenar la clave [dot]
o U+FF0E
?
Un enfoque que adopta el controlador afMorphia de Fantom es usar secuencias de escape Unicode similares a las de Java, pero asegurándose de que el carácter de escape se escape primero. En esencia, se realizan los siguientes reemplazos de cadenas (*):
\ --> \\
$ --> \u0024
. --> \u002e
Se realiza un reemplazo inverso cuando las claves del mapa se leen posteriormente desde MongoDB.
O en 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("\\\\", "\\")
}
El único momento en que un usuario debe estar al tanto de tales conversiones es cuando construye consultas para tales claves.
Dado que es común almacenar dotted.property.names
en bases de datos con fines de configuración, creo que este enfoque es preferible a simplemente prohibir todas estas claves de mapa.
(*) afMorphia en realidad realiza reglas de escape Unicode completas / adecuadas como se menciona en la sintaxis de escape Unicode en Java, pero la secuencia de reemplazo descrita funciona igual de bien.