所以,首先$binary
,BinData
基本上是相同的东西,以不同的方式书写/表示。使用您的示例和此参考,您可以在“Mongo Shell”模式下这样编写:
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")
或者在“严格”模式下变成:
{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }
现在,这里的类型 3 实际上是指根据BSON 规范的子类型 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
因此,您需要自己在 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