MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Вземете BinData UUID от Mongo като низ

Отговорът на вашия въпрос е по-сложен, отколкото бихте очаквали! Основната причина да е сложно е, че по исторически причини (за съжаление) различни драйвери са записали 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 със стандартен ред на байтове. Междувременно трябва да използвате подходящата помощна функция, която съответства на драйвера, който използвате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Декодиране на регистрационните файлове за грешки в MongoDB

  2. Защо грешката mongod е мъртва, но подсистемата е заключена и недостатъчно свободно място за файлове на дневници в Linux?

  3. MongoDB:Използване на съвпадение с променливи на входния документ

  4. Как да вмъкнете няколко елемента наведнъж в колекция MongoDB

  5. Изтеглете запис от масив чрез Meteor