sql >> Database teknologi >  >> NoSQL >> MongoDB

Hent BinData UUID fra Mongo som streng

Svaret på dit spørgsmål er mere kompliceret, end du ville forvente! Hovedårsagen til at det er kompliceret er, at forskellige drivere af historiske årsager (desværre) har skrevet UUID'er til databasen ved hjælp af forskellige byte-rækkefølger. Du nævner ikke, hvilken driver du bruger, men jeg vil bruge C#-driveren som eksempel.

Antag, at jeg bruger følgende kode til at indsætte et dokument:

var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
    { "_id", guid },
    { "x", 1 }
});

Hvis jeg så undersøger dokumentet ved hjælp af Mongo-skallen, ser det sådan ud:

> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

Mongo-skallen har en indbygget funktion kaldet hex, som du kan bruge til at vise den binære værdi som en hex-streng:

> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>

Se omhyggeligt:​​Byterækkefølgen af ​​hex-strengen matcher ikke den oprindelige UUID-værdi, der blev brugt i C#-programmet. Det skyldes, at C#-driveren bruger byte-rækkefølgen, der returneres af Microsofts ToByteArray-metode af Guid-klassen (som desværre returnerer bytes i en bizar rækkefølge, hvilket faktum ikke blev opdaget i mange måneder). Andre chauffører har deres egne idiosynkratier.

For at hjælpe med dette har vi nogle hjælpefunktioner skrevet i Javascript, som kan indlæses i Mongo-skallen. De er defineret i denne fil:

https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

Mongo-skallen kan få besked på at behandle en fil, når den starter op, ved at angive navnet på filen på kommandolinjen (sammen med --shell-argumentet). Efter at have indlæst denne fil har vi adgang til en række hjælpefunktioner til at oprette og vise BinData-værdier, der er UUID'er. For eksempel:

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 }
>

I dette eksempel bruges toCSUUID-funktionen til at vise en BinData-værdi som en CSUUID, og ​​CSUUID-funktionen bruges til at oprette en BinData-værdi for en UUID ved hjælp af C#-driverens byte-bestillingskonventioner, så vi kan forespørge på et UUID. Der er lignende funktioner for de andre drivere (toJUUID, toPYUUID, JUUID, PYUUID).

En dag i fremtiden vil alle drivere standardisere på en ny binær undertype 4 med en standard byte-rækkefølge. I mellemtiden skal du bruge den passende hjælpefunktion, der passer til den driver du bruger.



  1. hvordan læser du alle de bytes der kommer på en tcp-forbindelse?

  2. MongoDB $mod

  3. MongoDB-forespørgsel for kun at returnere indlejret dokument

  4. Udfyld en mangustmodel med et felt, der ikke er et id