MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Holen Sie sich die BinData-UUID von Mongo als Zeichenfolge

Die Antwort auf Ihre Frage ist komplizierter, als Sie erwarten würden! Der Hauptgrund für die Kompliziertheit ist, dass aus historischen Gründen (leider) verschiedene Treiber UUIDs mit unterschiedlichen Byte-Reihenfolgen in die Datenbank geschrieben haben. Sie erwähnen nicht, welchen Treiber Sie verwenden, aber ich werde den C#-Treiber als Beispiel verwenden.

Angenommen, ich verwende den folgenden Code, um ein Dokument einzufügen:

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

Wenn ich das Dokument dann mit der Mongo-Shell untersuche, sieht es so aus:

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

Die Mongo-Shell hat eine eingebaute Funktion namens hex, mit der Sie den Binärwert als Hex-String anzeigen können:

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

Schauen Sie genau hin:Die Byte-Reihenfolge der Hex-Zeichenfolge stimmt nicht mit dem ursprünglichen UUID-Wert überein, der im C#-Programm verwendet wird. Das liegt daran, dass der C#-Treiber die Byte-Reihenfolge verwendet, die von Microsofts ToByteArray-Methode der Guid-Klasse zurückgegeben wird (die leider die Bytes in einer bizarren Reihenfolge zurückgibt, was viele Monate lang nicht entdeckt wurde). Andere Fahrer haben ihre eigenen Eigenheiten.

Um dabei zu helfen, haben wir einige in Javascript geschriebene Hilfsfunktionen, die in die Mongo-Shell geladen werden können. Sie sind in dieser Datei definiert:

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

Die Mongo-Shell kann angewiesen werden, eine Datei beim Start zu verarbeiten, indem der Name der Datei in der Befehlszeile angegeben wird (zusammen mit dem Argument --shell). Nach dem Laden dieser Datei haben wir Zugriff auf eine Reihe von Hilfsfunktionen zum Erstellen und Anzeigen von BinData-Werten, die UUIDs sind. Zum Beispiel:

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 diesem Beispiel wird die toCSUUID-Funktion verwendet, um einen BinData-Wert als CSUUID anzuzeigen, und die CSUUID-Funktion wird verwendet, um einen BinData-Wert für eine UUID unter Verwendung der Byte-Ordnungskonventionen des C#-Treibers zu erstellen, damit wir eine UUID abfragen können. Für die anderen Treiber gibt es ähnliche Funktionen (toJUUID, toPYUUID, JUUID, PYUUID).

Eines Tages in der Zukunft werden alle Treiber auf einen neuen binären Subtyp 4 mit einer Standard-Byte-Reihenfolge standardisieren. In der Zwischenzeit müssen Sie die entsprechende Hilfsfunktion verwenden, die zu dem von Ihnen verwendeten Treiber passt.