La réponse à votre question est plus compliquée que vous ne le pensez ! La principale raison de cette complexité est que, pour des raisons historiques (malheureusement), différents pilotes ont écrit les UUID dans la base de données en utilisant différents ordres d'octets. 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 en utilisant le shell Mongo, cela ressemble à ceci :
> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>
Le shell Mongo dispose d'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 bien : l'ordre des octets de la chaîne hexagonale ne correspond pas à la valeur UUID originale 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 la classe Guid de Microsoft (qui renvoie malheureusement les octets dans un ordre bizarre, ce qui n'a pas été découvert avant plusieurs mois). D'autres pilotes ont leurs propres particularités.
Pour y remédier, nous disposons de quelques fonctions d'aide écrites en Javascript qui peuvent être chargées dans le shell Mongo. Elles sont définies dans ce fichier :
https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js
On peut demander au shell Mongo 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 les 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 sous la forme d'un CSUUID et la fonction CSUUID est utilisée pour créer une valeur BinData pour un UUID en utilisant les conventions d'ordonnancement des octets du pilote C# afin de pouvoir effectuer une requête sur un UUID. Il existe des fonctions similaires pour les autres pilotes (toJUUID, toPYUUID, JUUID, PYUUID).
Un jour, dans le futur, tous les pilotes seront standardisés sur un nouveau sous-type binaire 4 avec un ordre d'octet standard. En attendant, vous devez utiliser la fonction d'aide appropriée qui correspond au pilote que vous utilisez.