Att arbeta med GUID har några fallgropar, mestadels relaterade till hur man arbetar med den binära representationen i mongoskalet och även till historiska olyckor som resulterade i att olika förare lagrade GUID med olika byteordningar.
Jag använde följande kod för att illustrera problemen:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
som när jag körde det ut:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
när jag visar detta i mongo-skalet får jag:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Observera att även när den visas som hex matchar inte byteordningen den ursprungliga GUID. Det var den historiska olyckan jag pratade om. Alla bytes finns där, de är bara i en ovanlig ordning tack vare Microsofts implementering av Guid.ToByteArray().
För att hjälpa dig att arbeta med GUID i mongo-skalet kan du kopiera följande fil med hjälpfunktioner till katalogen där mongo.exe är lagrad:
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Filen har några korta dokumentationskommentarer överst som du kan ha nytta av. För att göra dessa funktioner tillgängliga i mongo-skalet måste du be mongo-skalet att läsa den här filen när den startar. Se följande exempelsession:
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 också använda en annan av hjälpfunktionerna för att fråga efter GUID:erna:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
När det gäller att lagra dina GUID:er som strängar är det inte en ovanlig sak att göra och det gör definitivt visning och sökning av data i mongo-skalet lättare och undviker alla problem med olika byteordningar. Den enda nackdelen är att den använder mer utrymme (ungefär dubbelt).