5

次の定義を持つcouchdbビュー「record_by_date_product」があります。

function(doc) {
  emit([doc.logtime, doc.product_id], doc);
}

次のようなクエリを実行しようとしています。

(logtime > fromdate & logtime < todate)  & product_id in (1,2,6)

このビューでこれは可能ですか?

また、couchdbpythonライブラリを使用してcouchdbにアクセスしています。コードスニペットは次のとおりです。

server = couchdb.Server()
db = server['mydb']

results = db.view('_design/record_by_date_product/_view/record_by_date_product')

このページhttp://packages.python.org/CouchDB/client.html#viewresultsは、開始キーと終了キーを使用できることを指定しています。しかし、私はそれを機能させることができません。

ありがとう

4

3 に答える 3

5

私はちょうど正確な答えを見つけたと思います:

次のようなビュー'sampleview'を設計します。

{
   "records_by_date_product": {
       "map": "function(doc) {\n  emit([doc.prod_id, doc.logtime], doc);\n}"
   }
}

クエリパラメータは次のとおりです。

prod_id in [1,3]
from_date = '2010-01-01 00:00:00'
to_date = '2010-01-02 00:00:00'

次に、同じビューで2つの別々のクエリを実行する必要があります。

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]'

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]'

2番目のクエリでprod_idが変更されることを除いて、毎回同じクエリが実行されることに注意してください。結果は後で照合する必要があります。お役に立てれば!

于 2011-01-14T18:44:57.367 に答える
3

その正確なクエリは不可能です。ドキュメントが示唆しているように、特定のキー範囲のビューですべてを取得できます。ビューはソートされたデータ構造であるため、この要求を満たすためにCouchDBが行うのは、開始キーを見つけて、終了キーを押すまでアイテムを返し始めることだけです。

このクエリに使用する必要がある戦略は、データ自体の特性によって異なります。logtime最も重要なことは、キー( )の最初の部分のみを使用し、Pythonでそれらを反復処理して、product_id一致しないアイテムを削除する場合、アイテムの削除に多くの時間を浪費するでしょうか。その場合は、主に。でソートされた別のビューを作成することを検討する必要がありますproduct_id。そうでない場合は、先に進んで、除草アプローチを使用してください。

于 2011-01-13T14:00:45.693 に答える
-1

このソリューションはどうですか?

  1. logtimeをインデックスとして各製品のビューを作成します。
  2. 必要に応じて各ビューにアクセスし、範囲を使用して結果をフィルタリングします-[fromdate todate]
  3. 入力パラメーターの製品ごとに3を実行し、結果を照合します

これには、すべての製品についてビューを作成する必要があり、これは手動プロセスのように見えるという欠点があります。

ちょっとした考え!あなたの意見を教えてください。

于 2011-01-14T08:17:15.097 に答える