2

Mongoのすべてのドキュメントに、(python uuidモジュールからの)uuid.uuid1()の値を持つ「GUID」キーを追加しています。文字列としてではなく、タイプBSON::Binaryとして格納されていることに気付きました。私はすでにいくつかのグーグルを実行しましたが、このシリアル化の目的/利点が何であるかをまだ理解していません。誰かが説明できますか?保存する前にuuid.uuid1()を文字列に変換する必要がありますか?文字列を使用して、db.myCol.find({'GUID':aString})のようなGUID値でfind()を実行するにはどうすればよいですか?

4

1 に答える 1

5

Python の既定のシリアル化では、 BSON 仕様のバイナリ表現がuuid使用されます。これにより、範囲クエリの一貫した並べ替えが保証され、データ/インデックスに使用するストレージも少なくて済みます。UUID

たとえば、次の 3 つの文字列は 16 進数では同等です。

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..ただし、文字列として異なる並べ替え順序があります。

> db.uuidsort.find().sort({_id:1})
{ "_id" : "5D78AD35EA5F11E1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

bson サイズの比較:

> db.uuidtest.find()
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

> Object.bsonsize(db.uuidtest.findOne({_id: BinData(3,"XXitNepfEeGhg3BWgbKcRw==")}))
31

> Object.bsonsize(db.uuidtest.findOne({_id: "5d78ad35ea5f11e1a183705681b29c47"}))
47

文字列として挿入したい場合は、UUID.hexを使用して 32 文字の文字列を取得できます。

>>> db.uuidtest.insert({'_id': uuid.hex})
'5d78ad35ea5f11e1a183705681b29c47'

Python から文字列で UUID を見つけたい場合は、uuid.UUIDメソッドを使用できます。

>>> db.uuidtest.find_one({'_id':uuid.UUID('5d78ad35ea5f11e1a183705681b29c47')})
{u'_id': UUID('5d78ad35-ea5f-11e1-a183-705681b29c47')}

シェルから文字列で UUID を見つけたい場合mongoは、UUID()ヘルパーがあります。

> db.uuidtest.find({_id:UUID('5d78ad35ea5f11e1a183705681b29c47')})
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }

注: bson.binary の API ドキュメントで説明されているように、他のドライバー バージョンとの相互運用性のために利用できる UUID サブタイプが他にもいくつかあります。

于 2012-08-20T02:09:58.630 に答える