web-dev-qa-db-ja.com

mongodbシェルクエリでGUIDを使用するにはどうすればよいですか

MongoDBシェルを使用する場合、guidデータ型(コレクションで_idとして使用したもの)を使用するにはどうすればよいですか?.

次の形式は機能しません。

>db.person.find({"_id","E3E45566-AFE4-A564-7876-AEFF6745FF"});

ありがとう。

25
Journeyman

_id値を(文字列ではなく)BinDataのインスタンスと比較する必要があります。残念ながら、BinDataコンストラクターは16進文字列ではなくBase64文字列を取ります。

GUID値の最後に2桁の16進数がないため、この例では「00」と想定します。次の値は同等です。

16進数: "E3E45566-AFE4-A564-7876-AEFF6745FF00"(ダッシュは無視)

base64: "ZlXk4 + SvZKV4dq7/Z0X/AA =="

したがって、クエリは次のようになります。

> db.person.find({_ id:new BinData(3、 "ZlXk4 + SvZKV4dq7/Z0X/AA ==")})

バイナリサブタイプが正しく3に設定されていると想定しています。そうでない場合、データの作成にどのドライバーが使用されましたか?

14
Robert Stam

あなたは簡単に使うことができます:

.find({ "_id" : CSUUID("E3E45566-AFE4-A564-7876-AEFF6745FF")})
24
Edward Weinert

次のように、クエリの前で次のjs関数を使用できます。

function LUUID(uuid) {
    var hex = uuid.replace(/[{}-]/g, ""); // removes extra characters
    return new UUID(hex); //creates new UUID
}

db.person.find({"_id" : LUUID("E3E45566-AFE4-A564-7876-AEFF6745FF"});

関数を.jsファイルに保存してロードするか、クエリを実行する前に開くことができます。結果から値をコピーする場合は、関数の名前を次のように変更する必要があります。

  • レガシーUUIDのLUUID
  • JavaエンコーディングのJUUID
  • .netエンコーディングのNUUID
  • C#エンコーディングのCSUUID
  • pythonエンコーディングのPYUUID
12
Todd