MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Convertendo o _id binário do mongodb para LUUID usando o nó


Então, primeiro $binary e BinData são basicamente a mesma coisa escrita/representada de maneiras diferentes. Usando seu exemplo e esta referência, você pode escrevê-lo assim no modo "Mongo Shell":
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

Ou no modo "estrito" que se torna:
{ "$binary" : "AAGOBh3pqkWvtaK8AO2U9w==", "$type" : "03" }

Agora, o tipo 3 aqui realmente se refere ao subtipo 3 (do tipo binário) pela especificação BSON, o que significa que este é um subtipo "UUID (antigo)". De acordo com a referência acima, a string em si é na verdade uma base64 representação de uma string binária. Por causa disso (estou inferindo) robomongo é basicamente converter o UUID e exibi-lo para você quando estiver navegando pelos dados. Vamos tentar fazer isso manualmente no mongo shell, primeiro convertendo-o para hexadecimal:
> var foo = BinData(3, "AAGOBh3pqkWvtaK8AO2U9w==")
> foo.hex()
00018e061de9aa45afb5a2bc00ed94f7

Agora, vamos conectar isso em um construtor UUID e ver se ele traduz de volta:
> var uuid = new UUID("00018e061de9aa45afb5a2bc00ed94f7")
> uuid
BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

E tem - todos os robomongo está fazendo é adicionar alguns traços para facilitar a leitura. Apenas para completar, com seu outro exemplo, removerei os traços e criarei um UUID, mostrarei o BinData versão e converter de volta:
> var bar = UUID("d72f21fe47808040ab3da1fb01045d3a")
> bar
BinData(3,"1y8h/keAgECrPaH7AQRdOg==")
> bar.hex()
d72f21fe47808040ab3da1fb01045d3a

Portanto, o que você precisa fazer é converter entre a codificação base64 no nó você mesmo. Não tenho um node.js ambiente para testar, mas parece que isso já foi abordado em outro lugar no site.

EDITAR:


Esta é uma função de trabalho no Node.JS que converte o binário em Hex 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