我试图将数据从mongodb移动到mysql
我使用mongoexport
将数据从mongodb数据库导出到.json文件
当我使用robomongo浏览我的mongodb集合时,我会以旧版UUID格式获取ID(类似于LUUID("00018e06-1de9-aa45-afb5-a2bc00ed94f7")
,但在导出的.json文件中,它会以这种方式显示:
{ "_id" : { "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }, ...}
有没有办法将后者转换为我在robomongo中使用Node.JS看到的格式?
P.S我看过很多参考二进制和BinData的Q& A - 但是他们没有展示如何转换它
答案 0 :(得分:4)
因此,首先关闭$binary
和BinData
基本上是以不同方式编写/表示的相同内容。使用您的示例和this reference,您可以在“Mongo Shell”模式下编写它:
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")
或以“严格”模式变为:
{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }
现在,类型3实际上是指BSON spec的子类型3(二进制类型),这意味着这是一个“UUID(旧)”子类型。根据上面的引用,字符串本身实际上是二进制字符串的base64
表示。因此(我推断)robomongo
基本上是在转换UUID并在浏览数据时为您显示。让我们尝试在mongo
shell中手动执行此操作,首先将其转换为十六进制:
> var foo = BinData(3, "AAGOBh3pqkWvtaK8AO2U9w==")
> foo.hex()
00018e061de9aa45afb5a2bc00ed94f7
现在,让我们将其插入到UUID构造函数中,看看它是否会转换回来:
> var uuid = new UUID("00018e061de9aa45afb5a2bc00ed94f7")
> uuid
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")
并且确实如此 - 所有robomongo
正在做的是添加一些破折号以便于阅读。为了完整起见,我将删除破折号并创建一个UUID,显示BinData
版本并转换回来:
> var bar = UUID("d72f21fe47808040ab3da1fb01045d3a")
> bar
BinData(3,"1y8h/keAgECrPaH7AQRdOg==")
> bar.hex()
d72f21fe47808040ab3da1fb01045d3a
因此,您需要做的是自己在节点中的base64编码之间进行转换。我没有要测试的node.js
环境,但看起来网站上的其他位置covered before。
这是Node.JS中的一个工作函数,它将二进制文件转换为Hex UUID:
function Bin2HexUUID(bin){
var hex = new Buffer(bin, 'base64').toString('hex');
return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, function (){
return arguments[1]+"-"+arguments[2]+"-"+arguments[3]+"-"+arguments[4]+"-"+arguments[5];
});
}
//use example
var binary_id = { "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" };
console.log(Bin2HexUUID(binary_id.$binary)); //00018e06-1de9-aa45-afb5-a2bc00ed94f7