sql >> Databasteknik >  >> NoSQL >> MongoDB

Hämta BinData UUID från Mongo som sträng

Svaret på din fråga är mer komplicerat än du förväntar dig! Den främsta anledningen till att det är komplicerat är att olika förare av historiska skäl (tyvärr) har skrivit UUID till databasen med olika byte-ordningar. Du nämner inte vilken drivrutin du använder, men jag använder C#-drivrutinen som exempel.

Anta att jag använder följande kod för att infoga ett dokument:

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

Om jag sedan undersöker dokumentet med Mongo-skalet ser det ut så här:

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

Mongo-skalet har en inbyggd funktion som kallas hex som du kan använda för att visa det binära värdet som en hex-sträng:

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

Titta noga:byteordningen för hexsträngen matchar inte det ursprungliga UUID-värdet som används i C#-programmet. Det beror på att C#-drivrutinen använder byteordningen som returneras av Microsofts ToByteArray-metod i klassen Guid (som tyvärr returnerar byten i en bisarr ordning, vilket faktum inte upptäcktes på många månader). Andra förare har sina egna idiosynkratier.

För att hjälpa till med detta har vi några hjälpfunktioner skrivna i Javascript som kan laddas in i Mongo-skalet. De är definierade i den här filen:

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

Mongo-skalet kan uppmanas att bearbeta en fil när den startar upp genom att ange namnet på filen på kommandoraden (tillsammans med --shell-argumentet). Efter att ha laddat den här filen har vi tillgång till ett antal hjälpfunktioner för att skapa och visa BinData-värden som är UUID. Till exempel:

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 det här exemplet används toCSUUID-funktionen för att visa ett BinData-värde som ett CSUUID och CSUUID-funktionen används för att skapa ett BinData-värde för ett UUID med hjälp av C#-drivrutinens byteordningskonventioner så att vi kan fråga efter ett UUID. Det finns liknande funktioner för de andra drivrutinerna (toJUUID, toPYUUID, JUUID, PYUUID).

Någon dag i framtiden kommer alla drivrutiner att standardisera på en ny binär subtyp 4 med en standardbyteordning. Under tiden måste du använda lämplig hjälpfunktion som matchar vilken drivrutin du än använder.



  1. node.js mongodb välj dokument med _id node-mongodb-native

  2. Så här gör du:Indexera data från S3 med CDP Data Hub

  3. skillnad mellan aggregat ($match) och fynd, i MongoDB?

  4. Hur installerar man php-redis-tillägget med den officiella PHP Docker-avbildningsmetoden?