Отговорът на вашия въпрос е по-сложен, отколкото бихте очаквали! Основната причина да е сложно е, че по исторически причини (за съжаление) различни драйвери са записали UUID в базата данни, използвайки различни байтове. Не споменавате кой драйвер използвате, но аз ще използвам драйвера на C# като пример.
Да предположим, че използвам следния код, за да вмъкна документ:
var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
{ "_id", guid },
{ "x", 1 }
});
Ако след това разгледам документа с помощта на обвивката Mongo, той изглежда така:
> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>
Shell Mongo има вградена функция, наречена hex, която можете да използвате за показване на двоичната стойност като шестнадесетичен низ:
> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>
Погледнете внимателно:редът на байтовете на шестнадесетичния низ не съвпада с оригиналната стойност на UUID, използвана в програмата на C#. Това е така, защото C# драйверът използва реда на байтовете, върнат от метода ToByteArray на Microsoft от класа Guid (който за съжаление връща байтовете в странен ред, който факт не беше открит в продължение на много месеци). Други шофьори имат свои собствени особености.
За да помогнем с това, имаме някои помощни функции, написани на Javascript, които могат да бъдат заредени в обвивката на Mongo. Те са дефинирани в този файл:
https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js
На обвивката Mongo може да се каже да обработва файл при стартиране, като предостави името на файла в командния ред (заедно с аргумента --shell). След като заредихме този файл, имаме достъп до редица помощни функции за създаване и показване на стойности на BinData, които са UUID. Например:
C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.1
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc._id.toCSUUID()
CSUUID("00112233-4455-6677-8899-aabbccddeeff")
> db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")})
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>
В този пример функцията toCSUUID се използва за показване на стойност на BinData като CSUUID, а функцията CSUUID се използва за създаване на стойност на BinData за UUID, използвайки конвенциите за подреждане на байтовете на драйвера C#, така че да можем да правим запитвания за UUID. Има подобни функции и за другите драйвери (toJUUID, toPYUUID, JUUID, PYUUID).
Някой ден в бъдеще всички драйвери ще се стандартизират върху нов двоичен подтип 4 със стандартен ред на байтове. Междувременно трябва да използвате подходящата помощна функция, която съответства на драйвера, който използвате.