12

根本的な問題-私のドキュメントに「カテゴリ」タイムスタンプがあるとしましょう。過去2時間以内のタイムスタンプを持つ「foo」カテゴリのすべてのドキュメントが必要な場合は、簡単です。

function (doc) {
  emit([doc.category, doc.timestamp], null);
}

次に、次のようにクエリします

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]

問題は、過去2時間以内にfooまたはbarのカテゴリに何かが必要な場合に発生します。時間を気にしない場合は、キーコレクションを介してキーで直接プルすることができます。残念ながら、範囲にはそのようなオプションはありません。

その間に私がやったことは、タイムスタンプを2時間のブロックに丸めてから、クエリを多重化することです。

POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]

動作しますが、(ブロックサイズとの関係で)かなりの時間を戻したい場合は面倒になります。

キーに似た、複数のstartKey / endKeyペアをビューに送信する方法はありますか:キー用に投稿できる[]配列?

4

3 に答える 3

9

それを可能にするCouchDB発行リクエストがあります。私はあなたのために働くかもしれないそのチケットに0.10.1への単純な、保証のないパッチを添付しました。それは私のために働き、私に次のようなことをさせてくれます:

{
    "keys": [
        {
            "startkey": ["0240286524","2010","03","01"],
            "endkey": ["0240286524","2010","03","07",{}]
        },
        {
            "startkey": ["0442257276","2010","03","01"],
            "endkey": ["0442257276","2010","03","07",{}]
        }
    ]
}

POST本文で、さまざまな日付の複数のトラッキングIDにわたるすべてのデータを取得できます。group=true&group_level=1結果をトラッキングIDでグループ化するためにを呼び出します。グループレベルを深くすると、id | year、id | year|monthなどを追跡してグループ化できます。

複数の接続は、2000を同時に作成することを検討しているため、私にとっては拡張性のないオーバーヘッドでした:)(いいえ、新しいビューはオプションではありません。データと1つのビューですでに400GBになっています!)

問題とパッチはhttps://issues.apache.org/jira/browse/COUCHDB-523にあります。

于 2010-03-24T00:11:16.640 に答える
4

2つのクエリを実行する方がおそらく良いでしょう。CouchDBは複数の同時クエリを非常にうまく処理できるため、複数のプロセス/スレッドをスピンオフし、fooとbarのドキュメントを別々にクエリします。

CouchDBは現在、複数の範囲のクエリをサポートしていません。キーのORとANDは、1つのクエリではほとんど実行できません。

于 2009-09-24T03:13:18.617 に答える
4

これは、CouchDBの新しいバージョンで追加されました。開始/終了キーの複数の範囲を追加するには、次のような本文でPOSTリクエストをビューに使用できます。

{
  "queries": [
    { "startkey": 10, "endkey": 11 },
    { "startkey": 16, "endkey": 18 }
  ]
}

古い質問だとは思いますが、これを探していたときに最初に見つけました。

于 2017-03-21T17:20:36.043 に答える