Odpowiedź na Twoje pytanie jest bardziej skomplikowana, niż byś się spodziewał! Głównym powodem, dla którego jest to skomplikowane, jest to, że z powodów historycznych (niestety) różne sterowniki zapisywały UUID w bazie danych przy użyciu różnych kolejności bajtów. Nie wspominasz, którego sterownika używasz, ale jako przykład użyję sterownika C#.
Załóżmy, że do wstawienia dokumentu używam następującego kodu:
var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
{ "_id", guid },
{ "x", 1 }
});
Jeśli następnie zbadam dokument za pomocą powłoki Mongo, wygląda to tak:
> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>
Powłoka Mongo ma wbudowaną funkcję o nazwie hex, której można użyć do wyświetlenia wartości binarnej jako ciągu szesnastkowego:
> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>
Przyjrzyj się uważnie:kolejność bajtów ciągu szesnastkowego nie odpowiada oryginalnej wartości UUID używanej w programie C#. Dzieje się tak, ponieważ sterownik C# używa kolejności bajtów zwróconej przez metodę ToByteArray firmy Microsoft z klasy Guid (która niestety zwraca bajty w dziwacznej kolejności, co nie zostało odkryte przez wiele miesięcy). Inni kierowcy mają swoje własne cechy charakterystyczne.
Aby w tym pomóc, mamy kilka funkcji pomocniczych napisanych w JavaScript, które można załadować do powłoki Mongo. Są one zdefiniowane w tym pliku:
https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js
Powłoki Mongo można nakazać przetworzenie pliku podczas uruchamiania, podając nazwę pliku w wierszu poleceń (wraz z argumentem --shell). Po załadowaniu tego pliku mamy dostęp do szeregu funkcji pomocniczych do tworzenia i wyświetlania wartości BinData będących identyfikatorami UUID. Na przykład:
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 }
>
W tym przykładzie funkcja toCSUUID jest używana do wyświetlania wartości BinData jako CSUUID, a funkcja CSUUID służy do tworzenia wartości BinData dla UUID przy użyciu konwencji kolejności bajtów sterownika C#, dzięki czemu możemy wykonywać zapytania dotyczące identyfikatora UUID. Istnieją podobne funkcje dla innych sterowników (toJUUID, toPYUUID, JUUID, PYUUID).
Pewnego dnia w przyszłości wszystkie sterowniki ujednolicą nowy binarny podtyp 4 ze standardową kolejnością bajtów. W międzyczasie musisz użyć odpowiedniej funkcji pomocniczej, która pasuje do dowolnego używanego sterownika.