Comme mentionné dans d'autres réponses, MongoDB ne permet pas de $
o .
comme clés de carte en raison de restrictions sur les noms de champs . Cependant, comme mentionné dans L'opérateur du signe du dollar s'échappe cette restriction ne vous empêche pas de en insérant des documents avec de telles clés, il vous empêche simplement de les mettre à jour ou de les interroger.
Le problème du simple remplacement .
con [dot]
o U+FF0E
(comme mentionné ailleurs sur cette page) est de savoir ce qui se passe lorsque l'utilisateur veut légitimement stocker la clé [dot]
o U+FF0E
?
Une approche qui Fantom's conducteur afMorphia consiste à utiliser des séquences d'échappement unicode similaires à celles de Java, mais en s'assurant que le caractère d'échappement est échappé en premier. En substance, les remplacements de chaînes de caractères suivants sont effectués (*) :
\ --> \\
$ --> \u0024
. --> \u002e
Un remplacement inverse est effectué lorsque les clés de la carte sont lues ultérieurement. de MongoDB.
Ou dans Fantôme code :
Str encodeKey(Str key) {
return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")
}
Str decodeKey(Str key) {
return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")
}
Le seul moment où l'utilisateur doit être conscient de ces conversions est lorsqu'il construit des requêtes pour ces clés.
Étant donné qu'il est courant de stocker dotted.property.names
dans les bases de données à des fins de configuration, je pense que cette approche est préférable à l'interdiction pure et simple de toutes ces clés de carte.
(*) afMorphia exécute effectivement les règles d'échappement unicode complètes et correctes, comme indiqué dans le document Syntaxe d'échappement Unicode en Java mais la séquence de remplacement décrite fonctionne tout aussi bien.