2017-09-21 13 views
0

私は動的にrethinkdbクエリをサーバー側に構築しようとしています。私は許容値のセットで、キーのセット内の各を渡す必要があり動的にrethinkdbクエリを構築する - python

r.db('test').table('data') 
.filter(function (row) { 
    return row('subgroup').eq('x').or(row('subgroup').eq('y')) 
    .and(
    .row('metric_id').eq('a') 
    .or(row('metric_id).eq('b') 
    .or(row('metric_id').eq('c')) 
}) 

:最終目標は、(JavaScriptで)およそ次のように構成されているクエリを持つことです。上記の例では、私はsubgroupx OR ymetric_ida OR b OR cであるためにすべてのレコードを返す必要があります

{ 
    'subgroup': ['x', 'y'], 
    'metric_id': ['a', 'b', 'c'] 
} 

クエリに渡すと思います。

私はこれを行う正しい方法で苦労しています。

{ 
    'entity_id': ['a', 'b'], 
    'metric_id': ['x'] 
} 

rethink_filterの入力で

def parse_filters(cls, filters): 
    def rethink_filter(data): 
     result = r.expr(True) # initialize filter function 
     for key in filters: 
      or_statements = [] 
      for value in filters[key]: 
       f = {} 
       f[key] = value 
       or_statements.append(r.expr(f)) # build a list of 
      result = result.and_(r.or_(r.expr(or_statements))) 
      if not result: 
       break 
     return result 

    return rethink_filter 

クエリを提供します:以下の1つの試みが参照

r.and_(r.and_(True, r.or_([{'entity_id': 'a'}, {'entity_id': 'b'}])), r.or_([{'metric_id': 'x'}])) 

それは私が後だな結果を与えるべきのように見えたが、 entity_idまたはmetric_idにかかわらず、テーブルのすべての項目を返します。

どこが間違っていますか?

+0

RethinkDBはこれらの種類のクエリを実行できますが、構築/維持が難しく、インデックスレベルのパフォーマンスを最適化することが難しい場合があります。このため、Elasticsearchなどのテクノロジーをデータベースに統合することは、この種の検索ユースケースに適している可能性があります。 –

答えて

0

r.orを中置演算子として使用するか、すべての引数をパラメータとして指定することができます。 1つのパラメータ、つまり配列のみを渡しています。

配列は常にTrueに評価されているので、このクエリ:

r.and_(r.and_(True, r.or_([{'entity_id': 'a'}, {'entity_id': 'b'}])), r.or_([{'metric_id': 'x'}])) 

が効果的に次のようになります。私はあなたがすべてのレコードに対してTrueと評価されます見ることができることを望む

r.and_(r.and_(True, r.or_(True)), r.or_(True)) 

パラメータを必要とするRethinkDBの関数に配列を渡す必要がある場合は、r.argsを使用できます。

また、r.or関数の中の辞書の略記を使用することはできません。つまり、{ 'entity_id' : 'a' }の代わりに、それらをdocument['entity_id'] == 'a'に翻訳する必要があります。ラムダ関数を使用してドキュメントにアクセスできます。filter documentationの例を参照してください。

関連する問題