6

次のオブジェクト構造があるとします。

{
   key1: "...",
   key2: "...",
   data: "..."
}

次のような2つの異なるビュー(キーごとに1つ)を設定せずに、key1とkey2の両方をクエリすることでCouchDBからこのオブジェクトを取得する方法はありますか?

select * from ... where key1=123 or key2=123

よろしくお願いいたします。Artjom

編集:

問題のより良い説明は次のとおりです。上記のオブジェクトは、シリアル化されたゲームの状態です。ゲームには、作成者ユーザー(key1)と対戦相手(key2)が1人だけいます。特定のユーザーについて、彼が関与しているすべてのゲーム(作成者と対戦相手の両方)を取得したいと思います。

4

4 に答える 4

4

両方のキーを発行します(または等しい場合は1つのみ):

function(doc) {
  if (doc.hasOwnProperty('key1')) {
    emit(doc.key1, 1);
  }
  if (doc.hasOwnProperty('key2') && doc.key1 !== doc.key2) {
    emit(doc.key2, 1);
  }
}

(適切にURLエンコードされた)を使用したクエリ:

?include_docs=true&key=123

または複数の値を使用する場合:

?include_docs=true&keys=[123,567,...]

更新: 1回のクエリで複数の値をクエリするように更新されました。

于 2012-05-31T05:40:21.267 に答える
2

次のような出力を生成する CouchDB ビューを作成できます。

["key1", 111],
["key1", 123],
["key2", 111],
["key2", 123],
etc.

JavaScript でマップ ビューを作成するのは非常に簡単です。

function(doc) {
    emit(["key1", doc["key1"]], null);
    emit(["key2", doc["key2"]], null);
}

クエリを実行する場合、複数のキーを使用してクエリを実行できます。

{"keys": [["key1", 123], ["key2", 123]]}

その JSON を POST のデータとしてビューに送信できます。または、できればプログラミング言語の API を使用してください。このクエリの結果は、いずれかのキーに一致するビュー内の各行になります。したがって、key1 と key2 の両方で一致するすべてのドキュメントは、ビューの結果で 2 つの行を返します。

于 2012-05-30T16:47:28.323 に答える
1

私も同様の質問、使い方に苦労していました

"select * from ... where key1=123 or key2=123". 

次のビューでは、LastNameまたはFirstName フィールドで顧客ドキュメントを検索できます。

function(doc) {
  if (doc.Type == "customer") {
      emit(doc.LastName, {FirstName: doc.FirstName, Address: doc.Address});
      emit(doc.FirstName, {LastName: doc.LastName, Address: doc.Address});
  }
}
于 2017-01-08T12:54:02.687 に答える