mongodb type Obtenir l'UUID BinData de Mongo sous forme de chaîne




mongodb types (3)

J'ai actuellement des identifiants stockés dans Mongo en tant qu'UUID (nécessaire pour le traitement). Ils sont renvoyés comme ceci:

"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==")

Quel serait un moyen facile de transformer cette valeur en une chaîne pour le débogage?

Juste pour être clair - l'application peut gérer les données très bien. J'ai juste besoin d'un moyen d'obtenir l'UUID de Mongo rapidement.


Utilisez cette fonction avant votre requête:

function ToGUID(hex) {
    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
    var b = hex.substr(10, 2) + hex.substr(8, 2);
    var c = hex.substr(14, 2) + hex.substr(12, 2);
    var d = hex.substr(16, 16);
    hex = a + b + c + d;
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
    return '"' + uuid + '"';
}

var id = new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==");
ToGUID(id.hex());

Résultat: "ea815826-0c02-e446-a984-00f62a687381"


La réponse à votre question est plus compliquée que ce à quoi vous vous attendez! La principale raison pour laquelle c'est compliqué est que pour des raisons historiques (malheureusement) différents pilotes ont écrit des UUID dans la base de données en utilisant des ordres d'octets différents. Vous ne mentionnez pas le pilote que vous utilisez, mais j'utiliserai le pilote C # comme exemple.

Supposons que j'utilise le code suivant pour insérer un document:

var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
    { "_id", guid },
    { "x", 1 }
});

Si j'examine ensuite le document en utilisant le shell Mongo, cela ressemble à ceci:

> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

Le shell Mongo possède une fonction intégrée appelée hex que vous pouvez utiliser pour afficher la valeur binaire sous la forme d'une chaîne hexadécimale:

> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>

Regardez attentivement: l'ordre des octets de la chaîne hexadécimale ne correspond pas à la valeur UUID d'origine utilisée dans le programme C #. C'est parce que le pilote C # utilise l'ordre des octets retourné par la méthode ToByteArray de Microsoft de la classe Guid (qui retourne malheureusement les octets dans un ordre bizarre, ce qui n'a pas été découvert pendant plusieurs mois). D'autres pilotes ont leurs propres idiosyncracies.

Pour aider avec cela, nous avons quelques fonctions d'aide écrites en Javascript qui peuvent être chargées dans le shell Mongo. Ils sont définis dans ce fichier:

https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

Le shell Mongo peut être dit de traiter un fichier au démarrage en fournissant le nom du fichier sur la ligne de commande (avec l'argument --shell). Après avoir chargé ce fichier, nous avons accès à un certain nombre de fonctions d'aide pour créer et afficher des valeurs BinData qui sont des UUID. Par exemple:

C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.1
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc._id.toCSUUID()
CSUUID("00112233-4455-6677-8899-aabbccddeeff")
> db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")})
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

Dans cet exemple, la fonction toCSUUID est utilisée pour afficher une valeur BinData en tant que CSUUID et la fonction CSUUID est utilisée pour créer une valeur BinData pour un UUID en utilisant les conventions d'ordre des octets du pilote C # afin de pouvoir interroger un UUID. Il existe des fonctions similaires pour les autres pilotes (toJUUID, toPYUUID, JUUID, PYUUID).

Un jour dans le futur, tous les pilotes normaliseront un nouveau sous-type binaire 4 avec un ordre d'octets standard. En attendant, vous devez utiliser la fonction d'assistance appropriée correspondant au pilote que vous utilisez.


Si vous utilisez Java spring-data, vous pouvez utiliser cet algorithme:

function ToUUID(hex) {
    var msb = hex.substr(0, 16);
    var lsb = hex.substr(16, 16);
    msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);
    lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);
    hex = msb + lsb;
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);

    return uuid;
}




mongodb