如何用PowerShell通过mongoimport导入含LUUID类型ID的JSON文件
我来帮你搞定这个问题!你遇到的核心问题是:MongoDB里的LUUID(也就是C# Guid对应的存储类型)本质是BinData子类型3,而你尝试的那些LUUID()或$LUUID()语法并不是MongoDB导入工具认可的标准格式,同时你的示例里还有JSON语法错误(比如Name : Foo里的Foo没加引号)。
正确的JSON格式(MongoDB扩展JSON)
MongoDB的导入工具(包括Mongo2Go依赖的底层工具)需要遵循MongoDB扩展JSON规范,对于LUUID,你需要用$binary对象来表示,具体格式如下:
{ "_id": { "$binary": { "base64": "SYSYimU1S02RTo5GUXBmXw==", "subType": "03" } }, "Date" : { "$date": "2014-03-20T03:09:27.000+01:00" }, "Name" : "Foo" }
关键细节说明
LUUID的BinData表示:
LUUID对应MongoDB BinData的子类型03(Legacy UUID,和C# Guid的字节顺序一致)。你需要把目标Guid转换成对应的base64编码字节数组:
比如你的Guid8a95184b-5125-4b0d-914e-8e4650f19b5c,在C#里可以这样转换:var targetGuid = Guid.Parse("8a95184b-5125-4b0d-914e-8e4650f19b5c"); var guidBytes = targetGuid.ToByteArray(); var base64String = Convert.ToBase64String(guidBytes); // 得到的base64就是:SYSYimU1S02RTo5GUXBmXw==JSON语法正确性:
你之前的所有选项里,Name : Foo都没有给字符串加引号,这是标准JSON的语法错误,会直接导致导入失败,必须写成"Name" : "Foo"。关于Mongo Shell语法的误区:
你尝试的LUUID()或$LUUID()是Mongo Shell里的快捷语法,但不是标准JSON格式,导入工具无法识别,必须用扩展JSON的$binary格式(或者v1版本的BinData(3, "base64String"),但后者属于Shell语法,部分严格的JSON解析器可能不支持)。
验证方法
你可以在Mongo Shell里运行BinData(3, "SYSYimU1S02RTo5GUXBmXw=="),会得到对应的LUUID值,确认和你的目标Guid一致后再写入JSON文件导入。
内容的提问来源于stack exchange,提问作者Azeristar

