4

我正在尝试将数据从 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 的问答 - 但没有一个展示了如何转换它

4

1 回答 1

6

所以,首先$binaryBinData基本上是相同的东西,以不同的方式书写/表示。使用您的示例和此参考,您可以在“Mongo Shell”模式下这样编写:

BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

或者在“严格”模式下变成:

{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }

现在,这里的类型 3 实际上是指根据BSON 规范的子类型 3(二进制类型),这意味着这是一个“UUID(旧)”子类型。根据上面的参考,字符串本身实际上是base64二进制字符串的表示。因此(我在推断)robomongo基本上是转换 UUID 并在您浏览数据时为您显示它。让我们尝试在mongoshell 中手动执行此操作,首先将其转换为十六进制:

> 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
于 2014-09-11T16:06:44.403 回答