Práce s GUID má několik úskalí, většinou souvisejících s tím, jak pracovat s binární reprezentací v mongo shellu, a také s historickými nehodami, které vedly k tomu, že různé ovladače ukládaly GUID pomocí různého pořadí bajtů.
K ilustraci problémů jsem použil následující kód:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
který když jsem spustil výstup:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
když to zobrazím v mongo shellu, dostanu:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Všimněte si, že i když se zobrazí jako hexadecimální, pořadí bajtů neodpovídá původnímu GUID. To je ta historická nehoda, o které jsem mluvil. Jsou tam všechny bajty, jen jsou v neobvyklém pořadí díky implementaci Guid.ToByteArray(() od Microsoftu.
Abychom vám pomohli pracovat s GUID v mongo shellu, můžete zkopírovat následující soubor pomocných funkcí do adresáře, kde je uložen mongo.exe:
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Soubor má v horní části několik stručných komentářů k dokumentaci, které by vám mohly pomoci. Chcete-li tyto funkce zpřístupnit v mongo shellu, musíte říct mongo shellu, aby četl tento soubor při spuštění. Podívejte se na následující ukázkovou relaci:
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")
>
K dotazu na GUID můžete také použít další pomocnou funkci:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
Pokud jde o ukládání vašich GUID jako řetězců, není to nic neobvyklého a rozhodně to usnadňuje prohlížení a dotazování na data v mongo shellu a zabraňuje všem problémům s různými pořadími bajtů. Jedinou nevýhodou je, že zabírá více místa (zhruba dvojnásobek).