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

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

La réponse à votre question est plus compliquée que vous ne le pensez ! 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 je vais utiliser 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 à l'aide du shell Mongo, il ressemble à ceci :

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

Le shell Mongo a une fonction intégrée appelée hex que vous pouvez utiliser pour afficher la valeur binaire sous forme de 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 renvoyé par la méthode ToByteArray de Microsoft de la classe Guid (qui renvoie malheureusement les octets dans un ordre bizarre, ce qui n'a pas été découvert pendant de nombreux mois). Les autres conducteurs ont leurs propres idiosyncrasies.

Pour vous aider, nous avons quelques fonctions d'assistance é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 invité à 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'assistance 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 à l'aide des conventions d'ordre des octets du pilote C# afin que nous puissions interroger un UUID. Il existe des fonctions similaires pour les autres pilotes (toJUUID, toPYUUID, JUUID, PYUUID).

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