4

さまざまな種類のドキュメントで機能する一般的なクエリを作成することはできますか? たとえば、「ケース」と「工場」があり、それらには異なるフィールドのセットがあります。例えば:

{
    id: 'case_o1',
    name: 'Case numero uno',
    amount: 40
}

{
   id: 'factory_002',
   location: 'Venezuela',
   workers: 200,
   operating: true
}

エンティティのタイプ (ケースまたはファクトリ) と追加のパラメーターを渡し、それらに基づいて結果をフィルター処理する一般的なクエリを作成することは可能ですか? もちろん、JavaScript ビューを使用することもできますが、複数のフィールドでフィルター処理することはできません。ベネズエラにある、従業員数が 20 から 55 のすべての工場を取得したいとします。

私はこれで始めましたが、行き詰まりました:

select * from `mybucket` as entity
where position(meta(entity).id, $entity_type) == 0  

複数の述語を渡し、クエリでそれらを認識させるにはどうすればよいですか?

もちろん、次のようにフィールドを一覧表示できます。

where position(meta(entity).id, $entity_type) == 0  
and entity.location == 'Venezuela'
and entity.workers > $workers_min
and entity.workers < $workers_max 

しかしその後

  • エンティティごとに個別のクエリを作成する必要があります
  • それでも私の問題は解決しません - 述語を無視する方法がわかりません.次回 $workers_min と $workers_max が渡されなかった場合、述語 (列) ごとにクエリを作成する必要がありますか?
  • セキュリティ上の理由から、自由形式のクエリを生成して Couchbase サーバーに渡すことはできません。すべてのクエリは既にデータベースに保存されており、API はドキュメントからクエリを取得して実行するだけです。
  • WHERE $location IS MISSING OR entity.location == $location未定義の引数(たとえば、またはそのようなもの)に対して「短絡」するクエリを作成することは可能だと思います

任意のパラメータに基づいてデータセットを効果的にフィルタリングおよび順序付けできるクエリを作成することはまったく可能ですか? それとも仕方がない?

4

2 に答える 2

1

@アグザム。ごめん。あなたがそれを言ったとき、私は私のコメントを書いていました。とにかく。あなたが求めていることは、あまり複雑ではない式で合体を使用することで可能ですが、これは内部データベースの最適化のほとんどを大幅に台無しにするため、本当に悪い考えです. 既存のインデックスの使用を含みます。したがって、比較的小さなデータベースを扱っている場合 (そして、ほぼ同じサイズのままであると確信している場合) を除いて、別のアプローチを試してみることをお勧めします... 実際、これが sqlapi を実装した理由です。

以前にすべてのクエリをデータベースに保存する必要がある場合は、指定された引数をその名前でソートし、可能な組み合わせごとに事前計算されたクエリを事前に計算して保存する方がはるかに優れている可能性があります。

于 2015-11-03T21:23:40.507 に答える
0

が使用されていない場合は、変数にデフォルト値を割り当てることでそれを行うことができます。たとえば、$location を使用しない場合、デフォルト値として -1 に設定できます。その場合、where 条件は次のようになります。

WHERE ($location=-1 OR entity.location = $location)
于 2015-11-10T17:27:35.837 に答える