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

Mit Mongodb und Guids für die ID von Dokumenten, was ist eine effiziente Möglichkeit, die Guids zu speichern, um die tatsächliche Guid einfach abzurufen?

Die Arbeit mit GUIDs hat ein paar Fallstricke, hauptsächlich im Zusammenhang mit der Arbeit mit der binären Darstellung in der Mongo-Shell und auch mit historischen Unfällen, die dazu führten, dass verschiedene Treiber GUIDs mit unterschiedlichen Byte-Reihenfolgen speicherten.

Ich habe den folgenden Code verwendet, um die Probleme zu veranschaulichen:

var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);

was, wenn ich es ausführte, ausgegeben wurde:

Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be

Wenn ich dies in der Mongo-Shell zeige, bekomme ich:

> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>

Beachten Sie, dass die Byte-Reihenfolge auch dann nicht mit der ursprünglichen GUID übereinstimmt, wenn sie als Hex angezeigt wird. Das ist der historische Unfall, von dem ich sprach. Alle Bytes sind da, sie sind nur in einer ungewöhnlichen Reihenfolge dank Microsofts Implementierung von Guid.ToByteArray().

Um Ihnen die Arbeit mit GUIDs in der Mongo-Shell zu erleichtern, können Sie die folgende Datei mit Hilfsfunktionen in das Verzeichnis kopieren, in dem mongo.exe gespeichert ist:

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

Die Datei enthält oben einige kurze Dokumentationskommentare, die Sie möglicherweise hilfreich finden. Um diese Funktionen in der Mongo-Shell verfügbar zu machen, müssen Sie der Mongo-Shell mitteilen, diese Datei beim Start zu lesen. Sehen Sie sich die folgende Beispielsitzung an:

C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.6
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
> doc._id.toCSUUID()
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")
>

Sie könnten auch eine andere Hilfsfunktion verwenden, um die GUIDs abzufragen:

> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>

Das Speichern Ihrer GUIDs als Zeichenfolgen ist keine Seltenheit und erleichtert definitiv das Anzeigen und Abfragen der Daten in der Mongo-Shell und vermeidet alle Probleme mit unterschiedlichen Byte-Reihenfolgen. Der einzige Nachteil ist, dass es mehr Platz benötigt (ungefähr doppelt).