Praca z identyfikatorami GUID ma kilka pułapek, głównie związanych z pracą z reprezentacją binarną w powłoce mongo, a także z historycznymi wypadkami, które spowodowały, że różne sterowniki przechowują identyfikatory GUID przy użyciu różnych kolejności bajtów.
Do zilustrowania problemów użyłem następującego kodu:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
które po uruchomieniu wyświetla:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
kiedy wyświetlam to w powłoce mongo, otrzymuję:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Zwróć uwagę, że nawet jeśli jest wyświetlany jako szesnastkowy, kolejność bajtów nie jest zgodna z oryginalnym identyfikatorem GUID. To historyczny wypadek, o którym mówiłem. Wszystkie bajty tam są, są po prostu w nietypowej kolejności dzięki implementacji Microsoft Guid.ToByteArray().
Aby ułatwić pracę z identyfikatorami GUID w powłoce mongo, możesz skopiować następujący plik funkcji pomocniczych do katalogu, w którym przechowywany jest plik mongo.exe:
https://github.com/rstam/mongo-csharp -driver/blob/master/uuidhelpers.js
Na górze pliku znajdują się krótkie komentarze dotyczące dokumentacji, które mogą okazać się pomocne. Aby udostępnić te funkcje w powłoce mongo, musisz powiedzieć powłoce mongo, aby czytała ten plik podczas uruchamiania. Zobacz następującą przykładową sesję:
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")
>
Możesz również użyć innej funkcji pomocniczej do zapytania o identyfikatory GUID:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
Jeśli chodzi o przechowywanie identyfikatorów GUID jako ciągów, nie jest to niespotykane rozwiązanie i zdecydowanie ułatwia przeglądanie i odpytywanie danych w powłoce mongo i pozwala uniknąć wszystkich problemów z różnymi kolejnościami bajtów. Jedyną wadą jest to, że zajmuje więcej miejsca (mniej więcej dwukrotnie).