MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Conversion de mongodb Binary _id en LUUID à l'aide de node

Donc, tout d'abord $binary et BinData sont fondamentalement la même chose écrite/représentée de différentes manières. En utilisant votre exemple et cette référence, vous pouvez l'écrire ainsi dans le mode "Mongo Shell":

BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

Soit en mode "strict" cela devient :

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

Maintenant, le type 3 ici fait référence au sous-type 3 (du type binaire) selon la spécification BSON, ce qui signifie qu'il s'agit d'un sous-type "UUID (ancien)". Selon la référence ci-dessus, la chaîne elle-même est en fait un base64 représentation d'une chaîne binaire. À cause de cela (j'en déduis) robomongo convertit essentiellement l'UUID et l'affiche pour vous lorsque vous parcourez les données. Essayons de le faire manuellement à la place dans le mongo shell, d'abord en le convertissant en hex :

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

Maintenant, connectons cela à un constructeur UUID et voyons s'il se traduit :

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

Et, c'est le cas - tout robomongo fait est d'ajouter quelques tirets pour la lisibilité. Juste pour être complet, avec votre autre exemple, je vais supprimer les tirets et créer un UUID, afficher le BinData version et reconvertir :

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

Par conséquent, ce que vous devez faire est de convertir vous-même l'encodage base64 dans le nœud. Je n'ai pas de node.js environnement à tester, mais il semble que cela ait déjà été traité ailleurs sur le site.

MODIFIER :

Il s'agit d'une fonction de travail dans Node.JS qui convertit le binaire en 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