【问题标题】:MongoImport: How to import json file (which contains guid) via powershellMongoImport:如何通过 powershell 导入 json 文件(包含 guid)
【发布时间】:2018-01-23 15:10:16
【问题描述】:

我知道如何通过 powershell 导入 json 文件,但是是否可以通过 powershell 导入包含 Guid 作为 ID 的 json 文件?

C# 将 Guid 转换为 mongodb 类型的 LUUID。

例如,我想使用 Mongo2go 进行集成测试 - 我想导入 json 文件作为示例数据。 json文件应该长什么样子,让mongoimporter明白字段ID来自LUUID?

我尝试过关注 Json:

选项1

    {
       "_id": LUUID("8a95184b-5125-4b0d-914e-8e4650f19b5c"),
       "Date" : {$date: "2014-03-20T03:09:27.000+01:00"},
       "Name" : Foo
    }

选项2

    {
       "_id": $LUUID("8a95184b-5125-4b0d-914e-8e4650f19b5c"),
       "Date" : {$date: "2014-03-20T03:09:27.000+01:00"},
       "Name" : Foo
    }

选项3

    {
       "_id": {LUUID : "8a95184b-5125-4b0d-914e-8e4650f19b5c"},
       "Date" : {$date: "2014-03-20T03:09:27.000+01:00"},
       "Name" : Foo
    }

选项 4

    {
       "_id": {$LUUID : "8a95184b-5125-4b0d-914e-8e4650f19b5c"},
       "Date" : {$date: "2014-03-20T03:09:27.000+01:00"},
       "Name" : Foo
    }

选项 5

    {
       "_id": {LUUID : {"8a95184b-5125-4b0d-914e-8e4650f19b5c"}},
       "Date" : {$date: "2014-03-20T03:09:27.000+01:00"},
       "Name" : Foo
    }        

选项 6

    {
       "_id": {$LUUID : {"8a95184b-5125-4b0d-914e-8e4650f19b5c"}},
       "Date" : {$date: "2014-03-20T03:09:27.000+01:00"},
       "Name" : Foo
    }

但它们都不起作用。

【问题讨论】:

  • 什么是 C# guid,与“普通”guid 相比?
  • @RandRadom 我想说的是它是一个 guid,用 c# 创建的
  • 你有没有找到解决这个问题的方法?我有一个模拟 api,我遇到了同样的问题。

标签: c# json mongodb


【解决方案1】:

找到答案的最简单方法是使用mongoexport 导出数据并检查输出格式。结果证明格式不是很简单:

"_id":{"$binary":"GNIkQiYyu0CNNRsRHBQqLA==", "$type":"03"}

为以下 GUID 检索到此数据:{4224d218-3226-40bb-8d35-1b111c142a2c}。该 Base64 字符串被解码为由 Guid.ToByteArray() 方法返回的字节数组

18 d2 24 42 26 32 bb 40 8d 35 1b 11 1c 14 2a 2c

现在,当您知道格式后,您可以轻松构建所需的 json。然而,用该数据填充集合并使用 mongoexport 导出它似乎要容易得多。

【讨论】:

    【解决方案2】:

    这里有一小段代码可以帮助你。

    • Parse 方法将文件名作为输入,并返回一个新的临时文件名以及转换后的内容
    • ParseNUUIDs 接受一个 json 字符串并将 NUUID('...') 转换为它们的 MongoDB 对象表示

    希望它可以帮助某人......

    function ParseNUUIDs($content){
        $matches = ([regex]'(NUUID\(\")(.*)(\"\))').Matches($content);
        Foreach($m in $matches){
            $guid = [GUID]$m.Groups[2].Value
            $bytes = $guid.ToByteArray()
            $b64 = [Convert]::ToBase64String($bytes)
            $r = "{""" +  "$" + "binary"": """ + $b64 + """, """ + "$" +  "type"": ""03""}"
            $content = $content.replace($m.Value, $r)
        }
        return $content
    }
    
    function Parse($filename){
        $content = Get-Content $filename -Raw
        $content = ParseNUUIDs $content
        $tempFile = New-TemporaryFile
        $content | Out-File -FilePath $tempFile -Encoding utf8
        return $tempFile
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2011-07-10
      • 1970-01-01
      • 2016-01-23
      相关资源
      最近更新 更多