sql >> Database >  >> NoSQL >> MongoDB

Krijg BinData UUID van Mongo als string

Het antwoord op uw vraag is ingewikkelder dan u zou verwachten! De belangrijkste reden waarom het ingewikkeld is, is dat om historische redenen (helaas) verschillende stuurprogramma's UUID's naar de database hebben geschreven met verschillende bytevolgorden. Je vermeldt niet welk stuurprogramma je gebruikt, maar ik gebruik het C#-stuurprogramma als voorbeeld.

Stel dat ik de volgende code gebruik om een ​​document in te voegen:

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

Als ik het document vervolgens bekijk met de Mongo-shell, ziet het er als volgt uit:

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

De Mongo-shell heeft een ingebouwde functie genaamd hex die u kunt gebruiken om de binaire waarde als een hex-tekenreeks weer te geven:

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

Let goed op:de bytevolgorde van de hexadecimale tekenreeks komt niet overeen met de originele UUID-waarde die in het C#-programma wordt gebruikt. Dat komt omdat het C#-stuurprogramma de bytevolgorde gebruikt die wordt geretourneerd door de ToByteArray-methode van Microsoft van de klasse Guid (die helaas de bytes in een bizarre volgorde retourneert, wat maandenlang niet werd ontdekt). Andere chauffeurs hebben hun eigen eigenaardigheden.

Om hierbij te helpen hebben we enkele helperfuncties geschreven in Javascript die in de Mongo-shell kunnen worden geladen. Ze worden gedefinieerd in dit bestand:

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

De Mongo-shell kan worden gevraagd om een ​​bestand te verwerken terwijl het opstart door de naam van het bestand op de opdrachtregel op te geven (samen met het argument --shell). Nadat we dit bestand hebben geladen, hebben we toegang tot een aantal helperfuncties om BinData-waarden te maken en weer te geven die UUID's zijn. Bijvoorbeeld:

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

In dit voorbeeld wordt de functie toCSUUID gebruikt om een ​​BinData-waarde weer te geven als een CSUUID en wordt de functie CSUUID gebruikt om een ​​BinData-waarde voor een UUID te maken met behulp van de byte-ordeningsconventies van het C#-stuurprogramma, zodat we een UUID kunnen opvragen. Er zijn vergelijkbare functies voor de andere stuurprogramma's (toJUUID, toPYUUID, JUUID, PYUUID).

Op een dag in de toekomst zullen alle stuurprogramma's standaardiseren op een nieuw binair subtype 4 met een standaard bytevolgorde. In de tussentijd moet je de juiste hulpfunctie gebruiken die overeenkomt met het stuurprogramma dat je gebruikt.



  1. Ik probeer een lijst met collecties van mangoest te krijgen

  2. Redis-lijsten

  3. Hoe krijg ik waarden van Redis met behulp van sleutels die spaties bevatten?

  4. MongoDB automatiseren en beheren met ClusterControl