MongoImport:如何通过powershell导入json文件(包含guid)

时间:2018-01-23 15:10:17

标签: c# json mongodb

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

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

例如我想与Mongo2go进行集成测试 - 我想将json文件作为样本数据导入。 json文件应该如何显示,以便mongoimporter能够理解字段ID来自LUUID?

我试过跟随Jsons:

选项1

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

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
    }

选项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
    }

但他们都没有工作。

2 个答案:

答案 0 :(得分:0)

找到答案的最简单方法是使用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导出它似乎要容易得多。

答案 1 :(得分:0)

这里有一些代码可以为您提供帮助。

  • Parse方法以文件名作为输入,并返回包含临时内容的新临时文件名
  • ParseNUUID接受一个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
}