c# - 从 MongoDB Compass Windows 应用程序导出和导入具有 UUID 的文档
问题描述
概括
导出和导入文档时如何保留 UUID?
- 将集合导出为 JSON 文件
- 删除收藏并重新创建收藏
- 导入 JSON 文件
- UUID 被转换为
Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0)
- 由于 4. 无法再从代码中读取文档。
细节
我需要从集合中的所有文档中删除一个字段,因此我考虑导出该集合中的所有文档并再次导入它们。在导入期间,我可以取消选择要删除的字段,这正是我需要的。
然而..
此集合中的文档包含 UUID:一个用于文档的 ID,一个用于另一个集合中另一个文档的 ID。
导出后,所有 UUID 都已转换为
{
"$binary":
{
"base64": "QDhscRPCgUAcwqLDosOwPDDDu8KNBA==",
"subType": "00"
}
当我将 json 文件导入回集合中时,所有文档 UUID 都替换为
Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0)
当我尝试从代码(C#)中获取这些文档时,我得到
反序列化 MongoDbGenericRepository.Models.Document 类的 Id 属性时出错:预期长度为 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 字符串
- 将 JSON 文件中的值替换为
"base64"
您在步骤 3 中获得的字符串 - 导入 JSON 文档并设置将存储这些 UUID 的字段
UUID
(Binary
默认情况下)
此解决方法有效。但是,当您有很多文档时,它变得不切实际,如果这些文档通过 UUID 引用其他文档,则更糟。因此,不幸的是,这种解决方法并不是真正的解决方案。
解决方案
推荐阅读
- javascript - Vue.js:如何更改 Vue2-slider 组件的颜色
- python - Tensorflow 未在 RTX 3060 Ti 上检测到 GPU
- python - 是否可以将另一级键迭代地添加到字典中以生成嵌套字典?
- android - 在片段中实现 setOnClickListener 时出现空指针异常
- python - Python Dictionary - 如何找到具有最少唯一值的所有键?
- excel - 使用 .Net 核心将数据表导出到 Excel
- r - 当 HTML 文件已存在时,Rmd 输出格式未在 blogdown 中正确编译
- javascript - 按 id 或 Date JavaScript 排序 JSON
- microsoft-graph-api - 备用更新日历事件未显示 Microsoft 团队链接
- javascript - JS:函数运行太快但不想使用 setTimeout 的快速补丁