2016-10-13 15 views
0

DocumentDB query playgroundを使用して、フィルタタイプのクエリを作成しています。私は、ユーザーが特定の属性で検索できるように設定されたデータ内に一連の属性を持っています。名前/値コレクション内の名前から複数の項目が選択されている場合は、各属性タイプとORステートメントになります。異なる属性(すなわち、色およびサイズ)が選択された場合、これはANDステートメントになります。配列のDocumentDB複数のフィルタクエリ

SELECT food.id, 
    food.description, 
    food.tags, 
    food.foodGroup 
FROM food 
JOIN tag1 IN food.tags 
JOIN tag2 IN food.tags 
WHERE (tag1.name = "snacks" OR tag1.name = "granola bars") 
AND (tag2.name = "microwave") 

このクエリはplaygroundで美しく機能します。

主な問題は、最大12個の属性があり、それ以上の属性があることです。一度私が5つのジョインをヒットしたら、これは私のmaximum allowedジョインの数なので、以下のクエリは機能しません。 (これは遊び場データではないことに注意してください、私自身のサンプル)

SELECT s.StyleID FROM StyleSearch s 
JOIN a0 in s.Attributes 
JOIN a1 in s.Attributes 
JOIN a2 in s.Attributes 
JOIN a3 in s.Attributes 
JOIN a4 in s.Attributes 
JOIN a5 in s.Attributes 
WHERE (a0 = "color-finish|Grey" OR a0 = "color-finish|Brown" OR a0 = "color-finish|Beige") 
AND (a1 = "fabric-type|Polyester" OR a1 = "fabric-type|Faux Leather") 
AND (a2 = "design-features|Standard" OR a2 = "design-features|Reclining") 
AND (a3 = "style_parent|Contemporary" OR a3 = "style_parent|Modern" OR a3 = "style_parent|Transitional") 
AND (a4 = "price_buckets|$1500 - $2000" OR a4 = "price_buckets|$2000 and Up") 
AND (a5 = "dimension_width|84 in +") 

私はこれを実行するには、適切なクエリを使用しています100%確実ではないけど、して動作し、以下のあたりのシンプルなwhere句SQLは、私はそれぞれの「AND声明からのアイテムで終わるように、または文で一致するものを持ち帰るここ

SELECT s.StyleID FROM StyleSearch s 
JOIN a in s.Attributes 
WHERE (a = "color-finish|Grey" OR a = "color-finish|Brown" OR a = "color-finish|Beige") 
AND (a = "fabric-type|Polyester" OR a = "fabric-type|Faux Leather") 
AND (a = "design-features|Standard" OR a = "design-features|Reclining") 
AND (a = "style_parent|Contemporary" OR a = "style_parent|Modern" OR a = "style_parent|Transitional") 
AND (a = "price_buckets|$1500 - $2000" OR a = "price_buckets|$2000 and Up") 
AND (a = "dimension_width|84 in +") 

は、データの例です。

{ 
    "StyleID": "chf_12345-bmc", 
    "Attributes": [ 
     "brand|chf", 
     "color|red", 
     "color|yellow", 
     "dimension_depth|30 in +", 
     "dimension_height|counter height", 
     "materials_parent|wood", 
     "price_buckets|$500 - $1000", 
     "style_parent|rustic", 
     "dimension_width|55 in +" 
    ] 
    } 

私は適切な方法を探しています手にそれで前もって感謝します。

答えて

3

ドキュメントの構造を変更して、具体的なクエリのフィルタ属性を追加することは可能ですか?

SELECT s.StyleID FROM StyleSearch s 
WHERE (CONTAINS(s.filter_color, "Grey") OR CONTAINS(s.filter_color, "Red")) 
AND (CONTAINS(s.filter_fabric_type, "Polyester") OR CONTAINS(s.filter_fabric_type, "Leather")) 

もちろん、これはあなたが維持するために追加のフィールドを持っていることを意味し:今、あなたのクエリは次のようになりますので、

 { 
     "StyleID": "chf_12345-bmc", 
     "Attributes": [ 
      "brand|chf", 
      "color|red", 
      "color|yellow", 
      "dimension_depth|30 in +", 
      "dimension_height|counter height", 
      "materials_parent|wood", 
      "price_buckets|$500 - $1000", 
      "style_parent|rustic", 
      "dimension_width|55 in +" 
     ], 
     "filter_color": "red,yellow", 
     "filter_fabric_type":"Polyester,leather" 
     } 

これは、参加制限を排除するであろう。

また、このためにストアドプロシージャを書いて、あなたのコレクションをループするためにJavaScriptを使用して、その道をフィルタリング検討するかもしれない:DocumentDB stored procedure tutorial

+0

のNoSQLに使用を取得するとき、私は余分な列に使用です。 =)DateTimeフィールドは非常に面白いです。私はこのアプローチが好きです...これにハイブリッドを見なければならないかもしれません。問題は、私が赤と秋の赤を価値として持っているときに起こります。そのクエリは、両方で赤と一致する可能性があります。 "CONTAINS(s.filter_color、" filter_color | red ")'またはよりシンプルな修飾子で '' filter_color ":" filter_color | red、filter_color | autumn red "私はこれを試して、あなたに戻ってきます。 – Matty

+0

すべてのフィルタと値だけを含むフィールドを追加しました。フィールドデータは次のようになります: '' | filter_color | red |、| filter_color | autumn red | ... ''フィールドの周囲にパイプを置くことで、また、私はこれのためにちょうど使用されている1つの追加のフィールドを持っています。非常に速い。 – Matty

関連する問題