アプリケーションにフィルター機能を実装していますが、CouchDB でのビューの書き込みに問題があります。SQL では、これは複数の結合を持つステートメントになります。CouchDB で複数の結合を置き換える方法。この記事では、単一結合について説明しています: http://www.cmlenz.net/archives/2007/10/couchdb-joins。ただし、このアプローチを複数の結合に拡張する方法は明らかではありません。
オブジェクトに多数のプロパティがあり、各プロパティに個別のフィルターを設定できるとします。簡単にするために、2 つのプロパティしかないと仮定しましょう。それを解決できれば、おそらく任意の数のプロパティに拡張できます。
私のアプリケーションは、一連の AND フィルターをサポートする必要があります。たとえば、場所が ("Seattle", "New York") AND start-epoch >= 1336608413 のすべてのセッションを検索します。また、フィルター設定を保持する必要もあります。
SQL には、Session と Filter という 2 つのテーブルがあります。次に、Session テーブルと Filter テーブルの間のフィルター条件ごとに 1 つの結合を行い、フィルター処理されたすべてのセッションを取得します。
Session Table
location start-epoch
Seattle 1336608413
Filter Table
Name Value
location Seattle
location New York
start-epoch 1336608413
Query:
select *
from Session s
where exists (select 1 from Filter f where f.name = 'location' and f.value = s.location)
and exists (select 1 from Filter f on f.name = 'start-epoch' and s.start-epoch >= f2.value)
CouchDB では:
{"type":"session", "location":"Seattle", "start-epoch":1336608413}
次に、フィルターをモデル化し、ビューを作成する方法は?
フィルターは次のようになります。
{"type":"filter", "location":["Seattle", "New York"], "start-epoch":1336608413}
次に、ビューをどのように記述しますか?
これを CouchDB 内で実現したいと考えています。FilteredSessions というビューを作成し、Couch への 1 回の http 呼び出しでフィルター処理されたセッションを取得したいと考えています。理由は、5 つの異なるクライアント (iOS、Android、Silverlight、Ruby on Rails、および Windows 8) があり、ロジックを 5 回も書き直したくないためです。sqlite を使用すると、「FilteredView」というビューを作成してそれを実現できます。map reduce に同等のものを書きたいと思います。