sql >> Base de Datos >  >> NoSQL >> MongoDB

Convertir mongodb Binary _id a LUUID usando el nodo

Primero, $binary y BinData son básicamente lo mismo escrito/representado de diferentes maneras. Usando su ejemplo y esta referencia, puede escribirlo así en el modo "Mongo Shell":

BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

O en modo "estricto" que se convierte en:

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

Ahora, el tipo 3 aquí en realidad se refiere al subtipo 3 (del tipo binario) según la especificación BSON, lo que significa que este es un subtipo "UUID (antiguo)". Según la referencia anterior, la cadena en sí es en realidad un base64 representación de una cadena binaria. Por esto (estoy infiriendo) robomongo es básicamente convertir el UUID y mostrárselo cuando navega por los datos. Intentemos hacerlo manualmente en lugar de mongo shell, primero convirtiéndolo a hexadecimal:

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

Ahora, conectemos eso a un constructor UUID y veamos si se traduce de nuevo:

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

Y lo hace, todo robomongo está haciendo es agregar algunos guiones para mejorar la legibilidad. Solo para completar, con su otro ejemplo eliminaré los guiones y crearé un UUID, mostraré BinData versión y volver a convertir:

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

Por lo tanto, lo que debe hacer es convertir usted mismo entre la codificación base64 en el nodo. No tengo un node.js entorno para probar, pero parece que eso ya se ha cubierto antes en otra parte del sitio.

EDITAR:

Esta es una función de trabajo en Node.JS que convierte el binario a 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