2016-05-30 12 views
1

私はcloudantCloudant:複数のレベルでのフィルタリングと集約

{ 
    "id" : String 

    "state": String 
    "city": String 
    "zipcode": int 

    "productType": String 
    "make": String 
    "model": String 
    "sku": String 

    "usedOn": Date 
    "energyUSed": int 
    "durationUsed": int 
} 

に文書コレクションを持っている私は、複数のcriteriasにフィルタリングしたい - 州、市、郵便番号、作る、モデル、SKUなどと集計energyUsedとdurationUsed

私は、map/reduce、query indexes、および_findターゲットを使用して、クラウドのクエリを調べました。しかし、これらのどれも、複数のレベルでフィルタリングして集約するほど柔軟ではありません。

たとえば、メイクとモデルに基づいてフィルターをかけ、州または都市レベルで集計したいと思います。別のケースでは、都道府県、市区町村、市区町村、モデル、モデルに基づいてフィルターをかけ、月レベルで(usedOnを使用して)集計したいと思います。

ご迷惑をおかけして申し訳ありません。

答えて

0

右のビュー(地図/縮小機能)を定義することで、かなり多くのことを達成できます。

のは、あなたが国家や都市でメイクモデルと集計で使用するエネルギーやフィルタを見つけたいとしましょう、あなたは以下のマップを定義することができます。

var makeModelKey = doc.make + '_' + doc.model; 
emit([makeModelKey, doc.state, doc.city], doc.energyUsed); 

機能は、単に_sum 1に内蔵されている削減します。

特定のメイクとモデルでクエリを実行し、reduceのグループレベルを調整すると、make_modelごとにエネルギーを使い、状態別に分割してさらに都市別に分割することができます。

州と都市のみでグループ化する場合は、キーのmake_model部分を除いて別のビューを定義するだけです。

すべてを達成するために1つのビューを持つことはできません。カウチdBはRDBではありません。あなたは別のアプローチが必要です。

あなたの他のクエリでは、マップ/リダクション関数をわずかに異なるように定義する必要がありますが、そのすべてが達成可能です。

私は最初は難しかったことの1つは、「リレーショナル」な考え方から脱却することでした。つまり、SQL世界からdoc DBへの切り替えとマップ/リダクションの世界は、データとクエリのモデリングに対する別のアプローチが必要です。

+0

コメントありがとうございます。上記の複雑なキーを使用すると仮定すると、フィルタリングのためにstartKeyとendKeyを使用する必要があります。問題は、すべてのmake +モデルでエネルギーを使いたいのですが、州や都市をフィルタリングしたい場合、startKeyやendKeyのようにstartKey = [*、 'A'、{}]やendKey = *、 'Z'、{}]。どんな考えや提案も感謝しています。 – jaydeepva

関連する問題