Travailler avec des GUID présente quelques pièges, principalement liés à la façon de travailler avec la représentation binaire dans le shell mongo et également aux accidents historiques qui ont conduit différents pilotes à stocker des GUID en utilisant différents ordres d'octets.
J'ai utilisé le code suivant pour illustrer les problèmes :
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
qui, lorsque je l'ai exécuté, a produit :
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
quand j'affiche ceci dans le shell mongo, j'obtiens :
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Notez que même lorsqu'il est affiché en hexadécimal, l'ordre des octets ne correspond pas au GUID d'origine. C'est l'accident historique dont je parlais. Tous les octets sont là, ils sont juste dans un ordre inhabituel grâce à l'implémentation par Microsoft de Guid.ToByteArray().
Pour vous aider à travailler avec les GUID dans le shell mongo, vous pouvez copier le fichier de fonctions d'assistance suivant dans le répertoire où mongo.exe est stocké :
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Le fichier contient quelques brefs commentaires de documentation en haut qui pourraient vous être utiles. Pour rendre ces fonctions disponibles dans le shell mongo, vous devez indiquer au shell mongo de lire ce fichier au démarrage. Voir l'exemple de session suivant :
C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.6
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
> doc._id.toCSUUID()
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")
>
Vous pouvez également utiliser une autre des fonctions d'assistance pour rechercher les GUID :
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
En ce qui concerne le stockage de vos GUID sous forme de chaînes, ce n'est pas une chose inconnue à faire et cela facilite certainement la visualisation et l'interrogation des données dans le shell mongo et évite tous les problèmes avec différents ordres d'octets. Le seul inconvénient est qu'il utilise plus d'espace (environ le double).