GUIDの操作にはいくつかの落とし穴があります。これは主に、mongoシェルでバイナリ表現を操作する方法と、さまざまなドライバーがさまざまなバイト順序を使用してGUIDを格納するという歴史的な事故に関連しています。
問題を説明するために次のコードを使用しました:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
これを実行すると、次のように出力されます:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
これをmongoシェルに表示すると、次のようになります。
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
16進数で表示されている場合でも、バイト順序が元のGUIDと一致しないことに注意してください。それは私が話していた歴史的な事故です。すべてのバイトがそこにあり、MicrosoftのGuid.ToByteArray()の実装のおかげで、それらは異常な順序になっています。
mongoシェルでGUIDを操作しやすくするために、次のヘルパー関数のファイルをmongo.exeが保存されているディレクトリにコピーできます。
https://github.com/rstam/mongo-csharp -driver / blob / master / uuidhelpers.js
このファイルの上部には、役立つと思われる簡単なドキュメントコメントがいくつかあります。これらの関数をmongoシェルで使用できるようにするには、起動時にこのファイルを読み取るようにmongoシェルに指示する必要があります。次のサンプルセッションを参照してください:
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")
>
別のヘルパー関数を使用して、GUIDを照会することもできます。
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
GUIDを文字列として保存する限り、これは前例のないことではありません。これにより、mongoシェルでのデータの表示とクエリが確実に簡単になり、さまざまなバイト順序に関するすべての問題が回避されます。唯一の欠点は、より多くのスペース(約2倍)を使用することです。