Как упоминалось в других ответах, MongoDB не разрешает символы $
или в .
качестве ключей карты из-за ограничений на имена полей . Однако, как упоминалось в разделе «Оператор знака доллара», выход из этого ограничения не мешает вам вставлять документы с такими ключами, он просто не дает вам обновлять или запрашивать их.
Проблема простой замены .
на [dot]
или U+FF0E
(как упоминалось в другом месте на этой странице) заключается в том, что происходит, когда пользователь законно хочет сохранить ключ [dot]
или U+FF0E
?
Подход, который использует драйвер afMorphia от Fantom , заключается в использовании escape-последовательностей Unicode, аналогичных Java, но с обеспечением экранирования сначала escape-символа. По сути делаются следующие замены строк (*):
\ --> \\
$ --> \u0024
. --> \u002e
Обратная замена выполняется, когда ключи карты впоследствии считываются из MongoDB.
Или в коде Fantom :
Str encodeKey(Str key) {
return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")
}
Str decodeKey(Str key) {
return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")
}
Единственный раз, когда пользователю нужно знать о таких преобразованиях, - это при построении запросов для таких ключей.
Учитывая, что dotted.property.names
в базах данных принято хранить данные для целей настройки, я считаю, что этот подход предпочтительнее простого запрета всех таких ключей карты.
(*) afMorphia фактически выполняет полные / правильные правила экранирования Unicode, как указано в синтаксисе экранирования Unicode в Java, но описанная последовательность замены работает так же хорошо.