Экспорт и импорт документов с помощью UUID из приложения MongoDB Compass Windows

#c# #json #mongodb #uuid #mongodb-compass

Вопрос:

Краткие сведения

Как сохранить UUID при экспорте и импорте документов?

  1. Экспортируйте коллекцию в файл JSON
  2. Отбросьте коллекцию и создайте ее заново
  3. Импорт файла JSON
  4. UUID преобразуются в Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0)
  5. Больше не удается читать документы из кода из-за 4.

Подробные сведения

Мне нужно было удалить поле из всех документов в коллекции, поэтому я подумал об экспорте всех документов в этой коллекции и их повторном импорте. Во время импорта я могу отменить выбор поля, которое я хотел удалить, что именно то, что мне было нужно.

Однако..

Документы в этой коллекции содержат идентификаторы UUID: один для идентификатора документа, один для идентификатора другого документа в другой коллекции.

После экспорта все идентификаторы UUID были преобразованы в

 {
  "$binary": 
  {
    "base64": "QDhscRPCgUAcwqLDosOwPDDDu8KNBA==",
    "subType": "00"
}
 

Когда я импортирую файл json обратно в коллекцию, все идентификаторы UUID документов заменяются

 Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0)
 

Когда я пытаюсь получить эти документы из кода (C#), я получаю

Произошла ошибка при десериализации свойства Id класса MongoDbGenericRepository.Модели.Документ: Ожидаемая длина должна быть 16, а не 29.

Вещи, которые я пробовал

При импорте документа в MongoDB Compass появляется раскрывающийся список, позволяющий изменить тип поля: введите описание изображения здесь

  • Я попытался изменить это на UUID.
  • Я попытался изменить тип на UUID, как указано выше, а также вручную отредактировать "subType": "00" файл экспорта JSON в оба 03 и 04 . Когда я это сделал, в документах на самом деле были поля UUID вместо Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0) . Тем не менее, я все еще получаю ту же ошибку об ожидаемой длине при попытке получить эти документы из кода.
  • Я попытался изменить значение "subType": "00" на и 03 04 и сохранить тип поля как двоичный. Когда я это сделал, появился документ Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 3) , но я все равно получал ту же ошибку из кода.

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

Есть какие-либо предложения о том, как это исправить? Кроме того, есть ли какие-либо предложения по резервному копированию и восстановлению в этой ситуации?

Редактировать:

Я смог экспортировать и импортировать один документ. Шаги:

  1. Скопируйте все идентификаторы UUID документа в блокнот
  2. Экспорт документа в файл JSON
  3. Для каждого UUID используйте этот сайт, чтобы преобразовать UUID в строку base64
  4. Замените "base64" значение в файле JSON строкой, полученной на шаге 3
  5. Импортируйте документ JSON и установите поля, в которых будут храниться эти идентификаторы UUID UUID (это будет Binary по умолчанию).

Этот обходной путь работает. Однако это становится непрактичным, когда у вас много документов, и еще хуже, если эти документы ссылаются на другие документы по UUID. Поэтому, к сожалению, этот обходной путь на самом деле не является решением.

Комментарии:

1. Я не думаю, что проблема здесь в экспорте // импорте, если это фактический импорт без ошибок. Но в вашей модели C#, какое свойство атрибута вы используете для Id ? Если я правильно помню, это должно быть Guid

2. @Pogrindis он использует свойство идентификатора по умолчанию, которое поставляется с пакетом nuget «MongoDbGenericRepository», которое Guid помечено [BsonId]