И така, първо $binary
и BinData
са основно едно и също нещо, написано/представено по различни начини. Използвайки вашия пример и тази справка, можете да го напишете така в режим "Mongo Shell":
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")
Или в „строг“ режим, който става:
{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }
Сега, тип 3 тук всъщност се отнася до подтип 3 (от двоичен тип) според спецификацията на BSON, което означава, че това е подтип "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
среда за тестване, но изглежда, че това е било разгледано преди другаде в сайта.
РЕДАКТИРАНЕ:
Това е работеща функция в Node.JS, която преобразува двоичния файл в шестнадесетичен 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