首页 > 解决方案 > 从 MongoDB Compass Windows 应用程序导出和导入具有 UUID 的文档

问题描述

概括

导出和导入文档时如何保留 UUID?

  1. 将集合导出为 JSON 文件
  2. 删除收藏并重新创建收藏
  3. 导入 JSON 文件
  4. UUID 被转换为Binary('bsOPwpzDrcKCcE0Iwr1FwrHDn8KRfsKdw7U=', 0)
  5. 由于 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 都搞砸了,不能再使用它们了:(

对于如何解决这个问题,有任何的建议吗?或者,有关如何针对这种情况进行备份和恢复的任何建议?

编辑:

我能够导出和导入一份文件。脚步:

  1. 将文档的所有 UUID 复制到记事本
  2. 将文档导出到 JSON 文件
  3. 对于每个 UUID,使用此站点将 UUID 转换为 base64 字符串
  4. 将 JSON 文件中的值替换为"base64"您在步骤 3 中获得的字符串
  5. 导入 JSON 文档并设置将存储这些 UUID 的字段UUIDBinary默认情况下)

此解决方法有效。但是,当您有很多文档时,它变得不切实际,如果这些文档通过 UUID 引用其他文档,则更糟。因此,不幸的是,这种解决方法并不是真正的解决方案。

标签: c#jsonmongodbuuidmongodb-compass

解决方案


推荐阅读