Работата с GUID има няколко клопки, свързани най-вече с това как да работите с двоичното представяне в mongo shell, а също и с исторически инциденти, които доведоха до различни драйвери, съхраняващи GUID, използвайки различни редове на байтове.
Използвах следния код, за да илюстрирам проблемите:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
което, когато го стартирах, изведе:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
когато покажа това в mongo shell, получавам:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Забележете, че дори когато се показва като шестнадесетичен, редът на байтовете не съвпада с оригиналния GUID. Това е историческият инцидент, за който говорих. Всички байтове са там, просто са в необичаен ред благодарение на внедряването на Guid.ToByteArray() от Microsoft.
За да ви помогнем да работите с GUID в mongo shell, можете да копирате следния файл с помощни функции в директорията, където се съхранява mongo.exe:
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Файлът има някои кратки коментари към документацията в горната част, които може да ви бъдат полезни. За да направите тези функции достъпни в mongo shell, трябва да кажете на mongo shell да прочете този файл, когато се стартира. Вижте следната примерна сесия:
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")
>
Можете също така да използвате друга помощна функция за заявка за GUID:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
Що се отнася до съхраняването на вашите GUID като низове, това не е нечувано нещо и определено прави преглеждането и запитването на данните в mongo shell по-лесно и избягва всички проблеми с различни редове на байтове. Единственият недостатък е, че използва повече място (приблизително двойно).