MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Z mongodb i guidami do identyfikatora dokumentów, jaki jest skuteczny sposób przechowywania identyfikatorów, aby łatwo uzyskać rzeczywisty identyfikator?

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).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Replikacja MongoDB w hybrydowym środowisku chmury

  2. Entity Framework i MongoDb

  3. Nie można połączyć się z MongoDB Atlas (queryTxt ETIMEOUT)

  4. Jak zaimportować plik Geojson do MongoDB

  5. Mongo. Zapytanie o dokumenty z tablicą, której dzieci WSZYSTKIE muszą pasować do zapytania