使用节点将mongodb Binary _id转换为LUUID
我正在尝试将数据从mongodb移动到mysql
我用来mongoexport
将数据从mongodb数据库导出到.json文件
当我使用robomongo浏览mongodb集合时,我得到的是旧版UUID格式的ID(类似,LUUID("00018e06-1de9-aa45-afb5-a2bc00ed94f7")
但在导出的.json文件中,它的显示方式如下:
{ "_id" : { "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }, ...}
是否有任何方法可以使用Node.JS将后者转换为robomongo中看到的格式?
PS我见过很多引用Binary和BinData的问答-但是没有一个人展示了如何转换它
回答:
因此,首先$binary
,BinData
基本上是相同的事物以不同的方式编写/表示。使用示例和此参考,您可以在“ Mongo Shell”模式下将其编写为:
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")
或在“严格”模式下变为:
{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }
现在,这里的类型3实际上是根据BSON规范引用的(二进制类型的)子类型3,这意味着这是“
UUID(旧)”子类型。根据上面的参考,字符串本身实际上base64
是二进制字符串的表示。因此(我在推断)robomongo
基本上是在浏览数据时转换UUID并为您显示。让我们尝试在mongo
外壳中手动进行操作,首先将其转换为十六进制:
> 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
因此,您需要做的是自己在node中的base64编码之间进行转换。我没有node.js
环境测试,但看起来已经覆盖之前在其他地方的网站上。
编辑:
这是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
以上是 使用节点将mongodb Binary _id转换为LUUID 的全部内容, 来源链接: utcz.com/qa/427035.html