Arbejdet med GUID'er har et par faldgruber, for det meste relateret til, hvordan man arbejder med den binære repræsentation i mongo-skallen og også til historiske ulykker, som resulterede i, at forskellige drivere lagrede GUID'er ved hjælp af forskellige byte-rækkefølger.
Jeg brugte følgende kode til at illustrere problemerne:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
som da jeg kørte det output:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
når jeg viser dette i mongo-skallen, får jeg:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Bemærk, at selv når den vises som hex, svarer byterækkefølgen ikke til den originale GUID. Det var den historiske ulykke, jeg talte om. Alle bytes er der, de er bare i en usædvanlig rækkefølge takket være Microsofts implementering af Guid.ToByteArray().
For at hjælpe dig med at arbejde med GUID'er i mongo-skallen kan du kopiere følgende fil med hjælpefunktioner til den mappe, hvor mongo.exe er gemt:
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Filen har nogle korte dokumentationskommentarer øverst, som du måske kan finde nyttige. For at gøre disse funktioner tilgængelige i mongo-skallen skal du bede mongo-skallen læse denne fil, når den starter op. Se følgende eksempelsession:
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")
>
Du kan også bruge en anden af hjælpefunktionerne til at forespørge efter GUID'erne:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
For så vidt angår lagring af dine GUID'er som strenge, er det ikke en uhørt ting at gøre, og det gør bestemt visning og forespørgsel på dataene i mongo-skallen nemmere og undgår alle problemer med forskellige byte-rækkefølger. Den eneste ulempe er, at den bruger mere plads (omtrent dobbelt).