使用节点将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的问答-但是没有一个人展示了如何转换它

回答:

因此,首先$binaryBinData基本上是相同的事物以不同的方式编写/表示。使用示例和此参考,您可以在“ 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

回到顶部