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

Pobierz BinData UUID z Mongo jako ciąg

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB i przyłącza

  2. Ładowanie częściowych nie powiodło się na serwerze JS

  3. Mongo nie może się uruchomić

  4. Jak korzystać z puli połączeń MongoDB w AWS Lambda?

  5. MongoDB — Zapytanie o kolekcję