sql >> データベース >  >> NoSQL >> MongoDB

文字列としてMongoからBinDataUUIDを取得します

    あなたの質問への答えはあなたが期待するよりももっと複雑です!複雑な主な理由は、歴史的な理由から(残念ながら)、さまざまなドライバーがさまざまなバイト順序を使用してUUIDをデータベースに書き込んだことです。使用しているドライバーについては言及していませんが、例としてC#ドライバーを使用します。

    次のコードを使用してドキュメントを挿入するとします。

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

    次に、Mongoシェルを使用してドキュメントを調べると、次のようになります。

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

    Mongoシェルには、16進数と呼ばれる組み込み関数があり、これを使用して2進値を16進文字列として表示できます。

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

    注意深く見てください。16進文字列のバイト順序が、C#プログラムで使用されている元のUUID値と一致していません。これは、C#ドライバーがGuidクラスのMicrosoftのToByteArrayメソッドによって返されるバイト順序を使用するためです(これは悲しいことに、奇妙な順序でバイトを返しますが、この事実は何ヶ月も発見されていませんでした)。他のドライバーには独自の特異性があります。

    これを支援するために、MongoシェルにロードできるJavascriptで記述されたいくつかのヘルパー関数があります。それらはこのファイルで定義されています:

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

    Mongoシェルは、コマンドラインでファイルの名前を(--shell引数とともに)指定することで、起動時にファイルを処理するように指示できます。このファイルをロードすると、UUIDであるBinData値を作成および表示するための多数のヘルパー関数にアクセスできるようになります。例:

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

    この例では、toCSUUID関数を使用してBinData値をCSUUIDとして表示し、CSUUID関数を使用してC#ドライバーのバイト順序規則を使用してUUIDのBinData値を作成し、UUIDでクエリを実行できるようにします。他のドライバー(toJUUID、toPYUUID、JUUID、PYUUID)にも同様の機能があります。

    将来的には、すべてのドライバーが標準バイトオーダーの新しいバイナリサブタイプ4で標準化される予定です。それまでの間、使用しているドライバーに一致する適切なヘルパー関数を使用する必要があります。



    1. パフォーマンス向上のためのMapReduceのパフォーマンスチューニング

    2. インデックスを使用していないクエリやmongodbで遅いクエリを見つける方法

    3. 致命的なエラー:クラス'MongoDB \ Driver\Manager'が見つかりません

    4. 起動時にMongoDBコンテナ用のDBを作成するにはどうすればよいですか?