Преобразование двоичного _id mongodb в LUUID с использованием узла

Я пытаюсь переместить данные из mongodb в mysql

я использовал mongoexport чтобы экспортировать данные из базы данных mongodb в файлы.json

Когда я просматриваю свою коллекцию mongodb с помощью robomongo, я получаю идентификаторы в устаревшем формате UUID (что-то вроде LUUID("00018e06-1de9-aa45-afb5-a2bc00ed94f7") но в экспортированных файлах.json это выглядит так: { "_id" : { "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }, ...}

Есть ли способ конвертировать последний в формат, который я вижу в robomongo, используя Node.JS?

PS Я видел много вопросов и ответов, которые ссылаются на Binary и BinData - но ни один из них не показал, как их преобразовать

1 ответ

Решение

Итак, прежде всего $binary а также BinData в основном одно и то же написано / представлено разными способами. Используя ваш пример и эту ссылку, вы можете написать это так в режиме "Mongo Shell":

BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

Или в "строгом" режиме, который становится:

{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }

Теперь тип 3 здесь фактически ссылается на подтип 3 (двоичного типа) согласно спецификации BSON, что означает, что это подтип "UUID (старый)". Согласно приведенной выше ссылке, сама строка на самом деле base64 представление двоичной строки. Из-за этого (я предполагаю) robomongo в основном конвертирует UUID и отображает его для вас, когда вы просматриваете данные. Давайте попробуем сделать это вручную вместо этого в mongo Оболочка, сначала преобразовав его в гекс:

> var foo = BinData(3, "AAGOBh3pqkWvtaK8AO2U9w==")
> foo.hex()
00018e061de9aa45afb5a2bc00ed94f7

Теперь давайте подключим это к конструктору UUID и посмотрим, будет ли он переведен обратно:

> var uuid = new UUID("00018e061de9aa45afb5a2bc00ed94f7")
> uuid
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

И это - все robomongo делает добавляет несколько штрихов для удобства чтения. Просто для полноты из вашего другого примера я удалю тире и создам UUID, покажу BinData версия и конвертировать обратно:

> var bar = UUID("d72f21fe47808040ab3da1fb01045d3a")
> bar
BinData(3,"1y8h/keAgECrPaH7AQRdOg==")
> bar.hex()
d72f21fe47808040ab3da1fb01045d3a

Следовательно, вам нужно преобразовать кодировку base64 на узле самостоятельно. У меня нет node.js среду для тестирования, но похоже, что это уже было рассмотрено в другом месте на сайте.

РЕДАКТИРОВАТЬ:

Это рабочая функция в Node.JS, которая преобразует двоичный код в шестнадцатеричный UUID:

function Bin2HexUUID(bin){
    var hex = new Buffer(bin, 'base64').toString('hex');
    return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, function (){
        return arguments[1]+"-"+arguments[2]+"-"+arguments[3]+"-"+arguments[4]+"-"+arguments[5];
    });
}

//use example
var binary_id = { "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" };
console.log(Bin2HexUUID(binary_id.$binary)); //00018e06-1de9-aa45-afb5-a2bc00ed94f7
Другие вопросы по тегам