2011-11-23 12 views
38

現在、私はいくつかのIDをUUIDとしてMongoに保存しています(処理に必要)。彼らは次のように返されます:MongoのBinData UUIDを文字列として取得

"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==") 

この値をデバッグ用の文字列に変換する簡単な方法はありますか?

ちょうど明らかである - アプリケーションはデータをうまく処理できます。私はMongoから実際のUUIDをすぐに取得する方法が必要です。

答えて

64

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

は、私は、ドキュメントを挿入するために、次のコードを使用したとします

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

私はその後、モンゴシェルを使用してドキュメントを調べると、それは次のようになります。

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

モンゴシェルは、Aがありますhexという組み込み関数を使用して、バイナリ値を16進文字列として表示することができます。

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

慎重に見てください:16進数文字列のバイト順は、C#プログラムで使用された元のUUID値と一致しません。これは、C#ドライバがGuidクラスのMicrosoftのToByteArrayメソッドから返されたバイトオーダーを使用するためです(奇妙なことにバイトを返す、悲しいことに、何ヶ月も発見されませんでした)。他のドライバーは独自の特質を持っています。

これを助けるために、Javascriptで書かれたいくつかのヘルパー関数をMongoシェルに読み込むことができます。彼らは、このファイルで定義されています。

​​

モンゴシェルはそれが(--shell引数と一緒に)、コマンドライン上のファイルの名前を提供することで、起動時にファイルを処理するように指示することができます。このファイルをロードすると、UUIDであるBinData値を作成して表示するためのヘルパー関数にアクセスできます。たとえば:CSUUIDとCSUUID機能がなるようにC#のドライバーのバイト順序の規則を使用して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値を表示するために使用され、我々 UUIDで照会できます。他のドライバにも同様の機能があります(toJUUID、toPYUUID、JUUID、PYUUID)。

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

+0

だけで何私は、ありがとう!私はこの背後にある歴史について知らなかった。 –

+0

私はこれを夢見ていたのですか、それを行うために別の方法を使用していませんでしたか?例えば。 '{" $ uuid ":" 00112233-4455-6677-8899-aabbccddeeff "}' – nilskp

+3

甘い聖なる幽霊これはばかげている。ありがとう、結構です。 –

2
お問い合わせの前に

使用この機能を:

function ToGUID(hex) { 
    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2); 
    var b = hex.substr(10, 2) + hex.substr(8, 2); 
    var c = hex.substr(14, 2) + hex.substr(12, 2); 
    var d = hex.substr(16, 16); 
    hex = a + b + c + d; 
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12); 
    return '"' + uuid + '"'; 
} 

var id = new BinData(3, "JliB6gIMRuSphAD2KmhzgQ=="); 
ToGUID(id.hex()); 

結果: "ea815826-0c02-e446-a984-00f62a687381"

0

は、Javaスプリング・データを使用している場合は、このアルゴリズムを使用することができます。

function ToUUID(hex) { 
    var msb = hex.substr(0, 16); 
    var lsb = hex.substr(16, 16); 
    msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2); 
    lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2); 
    hex = msb + lsb; 
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12); 

    return uuid; 
} 
関連する問題