sql >> Databáze >  >> NoSQL >> MongoDB

Převod binárního _id mongodb na LUUID pomocí uzlu

Nejprve tedy $binary a BinData jsou v podstatě totéž napsané/reprezentované různými způsoby. Pomocí svého příkladu a tohoto odkazu to můžete napsat takto v režimu "Mongo Shell":

BinData(3,"AAGOBh3pqkWvtaK8AO2U9w==")

Nebo v „přísném“ režimu, který se změní na:

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

Nyní zde typ 3 ve skutečnosti odkazuje na podtyp 3 (binárního typu) podle specifikace BSON, což znamená, že se jedná o podtyp „UUID (starý)“. Podle výše uvedeného odkazu je samotný řetězec ve skutečnosti base64 reprezentace binárního řetězce. Z tohoto důvodu (odvozuji) robomongo v podstatě převádí UUID a zobrazuje jej za vás, když prohlížíte data. Zkusme to udělat ručně v mongo shell, nejprve převedením na hex:

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

Nyní to zapojme do konstruktoru UUID a uvidíme, zda se to přeloží zpět:

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

A dělá - vše robomongo přidává několik pomlček pro čitelnost. Jen pro úplnost, s vaším dalším příkladem odstraním pomlčky a vytvořím UUID, ukážu BinData verze a převést zpět:

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

Co tedy musíte udělat, je převést mezi kódováním base64 v uzlu sami. Nemám node.js prostředí k otestování, ale zdá se, že to již bylo popsáno jinde na webu.

UPRAVIT:

Toto je pracovní funkce v Node.JS, která převádí binární kód na 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



  1. Hledání hodnoty libovolného pole v MongoDB bez jeho explicitního pojmenování

  2. Jak vyvíjet aplikace pro MongoDB a Redpanda pomocí Docker Compose

  3. Jak funguje PubSub v BookSleeve/Redis?

  4. Nakonfigurujte časový limit Jedisů