Вставка JSON-документа с ключом `.` в MongoDB


14

Во-первых, это скорее вопрос дизайна, чем вопрос программирования.

Я создаю приложение, в котором я должен получить существующие данные JSON и вставить их в MongoDB. Я обнаружил, что некоторые из документов JSON имеют точку .в ключе. Я прочитал в документации MongoDB, что точки .не разрешены как ключи в MongoDB, так как они используются для запросов.

Я не делаю много вставок в веб-приложениях, это почти единовременная вставка. Кроме того, я бы в основном получал весь документ, а не запрашивал его части, так как мне нужно было получить все данные.

Итак, учитывая мои требования, у меня есть два варианта, как хранить документ JSON:

  1. Найдите в ключах точку JSON и удалите их, а затем вставьте в MongoDB.
  2. Конвертируйте весь JSON в формат BSON и сохраните их как таковые, избегая при этом необходимости экранирования, и вручную анализируйте JSON при необходимости вне MongoDB

Не могли бы вы сказать мне, что будет лучше дизайн, так как я не могу прийти к выводу.


Один из способов решить эту проблему - использовать метод insert и установить для параметра check_keys значение false. Другой способ - просмотреть документ и заменить каждое вхождение проклятой точки чем-то другим или эквивалентным символом юникода (ну, символами).
Ноя

Ответы:


3

Есть несколько альтернатив:

1. Заменить точки тире.

Это был бы мой любимый подход, поскольку он сохраняет структуру достаточно явной.

Поскольку, по вашему мнению, «это в значительной степени однократная вставка», должно быть относительно просто проверить, не нарушает ли он что-либо (то есть уже есть тот же ключ с чертой). В других ситуациях выполнение этих проверок программно требует написания некоторого кода, но все еще является относительно простой задачей.

2. Замените точки на символ точки Unicode, такой как U + FF0E .

Я настоятельно рекомендую не использовать этот подход, так как это приведет к массивной головной боли отладки в будущем . Позволить кому-то, кто использует полученный JSON где-то в коде, далеко от MongoDB, догадаться, что точка на самом деле не точка, - это хороший способ потратить буквально недели чьего-то времени. Храните такие трюки с Юникодом для хакеров, которые хотят обмануть кого-то, думая, что персонаж другой.

3. Используйте BSON.

Поскольку вы утверждаете, что «в большинстве случаев извлекаете весь документ, а не запрашиваете его части», в вашем случае этот подход не имеет серьезных недостатков . Хотя вы сказали «в основном», что означает, что иногда вы извлекаете только части документа.

Как правило, недостатком является то, что вы не сможете осуществлять поиск по документу или загружать только его часть.

4. Используйте стандартную кодировку, такую ​​как Base64.

Преобразование проблемных ключей (или всех ключей, в зависимости от соотношения между проблемными и не проблемными) в Base64 или шестнадцатеричное может быть жизнеспособным решением, с преимуществом довольно явного: большинство разработчиков распознают значения Base64 или шестнадцатеричные с первого взгляда ,

Недостатком является увеличение занимаемой памяти, а также необходимость кодировать и декодировать ключи при их использовании.

5. Установите check_keysна false.

Я бы настоятельно рекомендовал не использовать этот подход, поскольку это сделало бы запрос данных двусмысленным и потратило бы часы или дни, пытаясь выяснить, почему конкретный запрос не выполняет то, что, по вашему мнению, он должен делать. Точка - зарезервированный персонаж, и проверка здесь, чтобы защитить вас; сказав MongoDB пропустить проверку, вы отложите только тот момент, когда вам придется иметь дело с конфликтом между синтаксисом MongoDB и зарезервированным символом, используемым в ключе.


0

Просто используйте BSON. Тогда у вас есть хорошо документированный формат, с хорошо протестированной библиотечной поддержкой, и, что самое важное, вы можете инвертировать его (кодировать / декодировать) без потерь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.