#c# #json #mongodb #uuid #mongodb-compass
Вопрос:
Краткие сведения
Как сохранить UUID при экспорте и импорте документов?
- Экспортируйте коллекцию в файл JSON
- Отбросьте коллекцию и создайте ее заново
- Импорт файла JSON
- UUID преобразуются в
Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0)
- Больше не удается читать документы из кода из-за 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 перепутались, и больше не могу их использовать 🙁
Есть какие-либо предложения о том, как это исправить? Кроме того, есть ли какие-либо предложения по резервному копированию и восстановлению в этой ситуации?
Редактировать:
Я смог экспортировать и импортировать один документ. Шаги:
- Скопируйте все идентификаторы UUID документа в блокнот
- Экспорт документа в файл JSON
- Для каждого UUID используйте этот сайт, чтобы преобразовать UUID в строку base64
- Замените
"base64"
значение в файле JSON строкой, полученной на шаге 3 - Импортируйте документ JSON и установите поля, в которых будут храниться эти идентификаторы UUID
UUID
(это будетBinary
по умолчанию).
Этот обходной путь работает. Однако это становится непрактичным, когда у вас много документов, и еще хуже, если эти документы ссылаются на другие документы по UUID. Поэтому, к сожалению, этот обходной путь на самом деле не является решением.
Комментарии:
1. Я не думаю, что проблема здесь в экспорте // импорте, если это фактический импорт без ошибок. Но в вашей модели C#, какое свойство атрибута вы используете для
Id
? Если я правильно помню, это должно бытьGuid
2. @Pogrindis он использует свойство идентификатора по умолчанию, которое поставляется с пакетом nuget «MongoDbGenericRepository», которое
Guid
помечено[BsonId]