Werken met GUID's heeft een aantal valkuilen, voornamelijk gerelateerd aan het werken met de binaire representatie in de mongo-shell en ook aan historische ongevallen die ertoe hebben geleid dat verschillende stuurprogramma's GUID's hebben opgeslagen met verschillende bytevolgorden.
Ik heb de volgende code gebruikt om de problemen te illustreren:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
die toen ik het uitvoerde:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
als ik dit in de mongo-shell weergeef, krijg ik:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Merk op dat zelfs wanneer weergegeven als hex, de bytevolgorde niet overeenkomt met de originele GUID. Dat is het historische ongeluk waar ik het over had. Alle bytes zijn aanwezig, ze staan alleen in een ongebruikelijke volgorde dankzij de implementatie van Guid.ToByteArray() door Microsoft.
Om u te helpen met GUID's in de mongo-shell te werken, kunt u het volgende bestand met hulpfuncties kopiëren naar de map waar mongo.exe is opgeslagen:
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Het bestand heeft bovenaan enkele korte documentatie-opmerkingen die u misschien nuttig vindt. Om deze functies beschikbaar te maken in de mongo-shell, moet je de mongo-shell vertellen om dit bestand te lezen terwijl het opstart. Bekijk de volgende voorbeeldsessie:
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")
>
U kunt ook een andere hulpfunctie gebruiken om de GUID's op te vragen:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
Wat betreft het opslaan van uw GUID's als strings, dat is niet ongehoord om te doen en het maakt het bekijken en opvragen van de gegevens in de mongo-shell zeker gemakkelijker en vermijdt alle problemen met verschillende bytevolgorden. Het enige nadeel is dat het meer ruimte in beslag neemt (ongeveer het dubbele).