Есть несколько альтернатив:
1. Заменить точки тире.
Это был бы мой любимый подход, поскольку он сохраняет структуру достаточно явной.
Поскольку, по вашему мнению, «это в значительной степени однократная вставка», должно быть относительно просто проверить, не нарушает ли он что-либо (то есть уже есть тот же ключ с чертой). В других ситуациях выполнение этих проверок программно требует написания некоторого кода, но все еще является относительно простой задачей.
Я настоятельно рекомендую не использовать этот подход, так как это приведет к массивной головной боли отладки в будущем . Позволить кому-то, кто использует полученный JSON где-то в коде, далеко от MongoDB, догадаться, что точка на самом деле не точка, - это хороший способ потратить буквально недели чьего-то времени. Храните такие трюки с Юникодом для хакеров, которые хотят обмануть кого-то, думая, что персонаж другой.
3. Используйте BSON.
Поскольку вы утверждаете, что «в большинстве случаев извлекаете весь документ, а не запрашиваете его части», в вашем случае этот подход не имеет серьезных недостатков . Хотя вы сказали «в основном», что означает, что иногда вы извлекаете только части документа.
Как правило, недостатком является то, что вы не сможете осуществлять поиск по документу или загружать только его часть.
4. Используйте стандартную кодировку, такую как Base64.
Преобразование проблемных ключей (или всех ключей, в зависимости от соотношения между проблемными и не проблемными) в Base64 или шестнадцатеричное может быть жизнеспособным решением, с преимуществом довольно явного: большинство разработчиков распознают значения Base64 или шестнадцатеричные с первого взгляда ,
Недостатком является увеличение занимаемой памяти, а также необходимость кодировать и декодировать ключи при их использовании.
Я бы настоятельно рекомендовал не использовать этот подход, поскольку это сделало бы запрос данных двусмысленным и потратило бы часы или дни, пытаясь выяснить, почему конкретный запрос не выполняет то, что, по вашему мнению, он должен делать. Точка - зарезервированный персонаж, и проверка здесь, чтобы защитить вас; сказав MongoDB пропустить проверку, вы отложите только тот момент, когда вам придется иметь дело с конфликтом между синтаксисом MongoDB и зарезервированным символом, используемым в ключе.