使用节点将mongodb二进制_id转换为LUUID

时间:2014-09-11 13:55:15

标签: node.js mongodb bson mongoexport

我试图将数据从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 - 但是他们没有展示如何转换它

1 个答案:

答案 0 :(得分:4)

因此,首先关闭$binaryBinData基本上是以不同方式编写/表示的相同内容。使用您的示例和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