MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Konvertieren von mongodb Binary _id in LUUID mithilfe von node

Also, zuerst $binary und BinData sind im Grunde dasselbe, auf unterschiedliche Weise geschrieben/dargestellt. Mit Ihrem Beispiel und dieser Referenz können Sie es so im "Mongo Shell"-Modus schreiben:

BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

Oder im "strengen" Modus wird das zu:

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

Nun bezieht sich Typ 3 hier tatsächlich auf Subtyp 3 (des binären Typs) gemäß der BSON-Spezifikation, was bedeutet, dass dies ein „UUID (old)“-Subtyp ist. Gemäß der obigen Referenz ist die Zeichenfolge selbst tatsächlich ein base64 Darstellung einer binären Zeichenkette. Aus diesem Grund (ich schließe daraus) robomongo konvertiert im Grunde die UUID und zeigt sie für Sie an, wenn Sie die Daten durchsuchen. Lassen Sie uns versuchen, dies stattdessen manuell im mongo zu tun Shell, indem Sie sie zuerst in hex:

umwandeln
> var foo = BinData(3, "AAGOBh3pqkWvtaK8AO2U9w==")
> foo.hex()
00018e061de9aa45afb5a2bc00ed94f7

Lassen Sie uns das jetzt in einen UUID-Konstruktor stecken und sehen, ob es zurückübersetzt wird:

> var uuid = new UUID("00018e061de9aa45afb5a2bc00ed94f7")
> uuid
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

Und das tut es - alles robomongo tut, fügt einige Bindestriche für die Lesbarkeit hinzu. Nur der Vollständigkeit halber werde ich bei Ihrem anderen Beispiel die Bindestriche entfernen und eine UUID erstellen, die BinData anzeigen Version und zurückkonvertieren:

> var bar = UUID("d72f21fe47808040ab3da1fb01045d3a")
> bar
BinData(3,"1y8h/keAgECrPaH7AQRdOg==")
> bar.hex()
d72f21fe47808040ab3da1fb01045d3a

Daher müssen Sie selbst zwischen der base64-Codierung im Knoten konvertieren. Ich habe keine node.js Umgebung zu testen, aber es sieht so aus, als wäre das schon einmal an anderer Stelle auf der Seite behandelt worden.

BEARBEITEN:

Dies ist eine funktionierende Funktion in Node.JS, die die Binärdatei in Hex UUID:

konvertiert
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