現在、私はいくつかのIDをUUIDとしてMongoに保存しています(処理に必要)。彼らは次のように返されます:MongoのBinData UUIDを文字列として取得
"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==")
この値をデバッグ用の文字列に変換する簡単な方法はありますか?
ちょうど明らかである - アプリケーションはデータをうまく処理できます。私はMongoから実際のUUIDをすぐに取得する方法が必要です。
現在、私はいくつかのIDをUUIDとしてMongoに保存しています(処理に必要)。彼らは次のように返されます:MongoのBinData UUIDを文字列として取得
"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==")
この値をデバッグ用の文字列に変換する簡単な方法はありますか?
ちょうど明らかである - アプリケーションはデータをうまく処理できます。私はMongoから実際のUUIDをすぐに取得する方法が必要です。
あなたの質問に対する答えは、あなたが期待するより複雑です!複雑な主な理由は、歴史的な理由から(残念なことに)異なるドライバが異なるバイトオーダを使用してデータベースに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を標準のバイト順序で標準化します。その間は、使用しているドライバと一致する適切なヘルパー関数を使用する必要があります。
使用この機能を:
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"
は、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;
}
だけで何私は、ありがとう!私はこの背後にある歴史について知らなかった。 –
私はこれを夢見ていたのですか、それを行うために別の方法を使用していませんでしたか?例えば。 '{" $ uuid ":" 00112233-4455-6677-8899-aabbccddeeff "}' – nilskp
甘い聖なる幽霊これはばかげている。ありがとう、結構です。 –