2016-10-13 4 views
0

Используя команду DocumentDB query playground, я работаю над типом запроса фильтра. У меня есть набор атрибутов в моих данных, которые настроены, чтобы позволить пользователю выполнять поиск по определенному атрибуту. Каждый тип атрибута становится и оператором OR, если несколько элементов выбраны из имени в коллекции name/value. Если атрибуты выбраны, которые отличаются (например, цвет и размер), это становится выражением 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% уверен, что я использую правильный запрос для выполнения, но простой, где положение на ниже которого работает в SQL возвращает ничего соответствия в или заявлений, так что я в конечном итоге с элементами из каждого «и заявление

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

Возможно ли изменить структуру вашего документа, чтобы добавить атрибуты фильтра, специально предназначенные для вашего запроса, например.

 { 
     "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" 
     } 

Это позволит устранить ограничение присоединиться, потому что теперь ваш запрос выглядит следующим образом:

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")) 

Конечно, это не означает, что у вас есть дополнительные поля для сохранения.

Вы могли бы также рассмотреть вопрос о написании хранимой процедуры для этого, используя JavaScript Переберите коллекции и фильтрацию таким образом: DocumentDB stored procedure tutorial

+0

Я использовать для дополнительных столбцов при получении использования в NoSQL. =) Поле DateTime - это так весело. Мне нравится этот подход ... возможно, придется посмотреть на гибрид к этому. Проблема возникнет, когда у меня есть Red и Autumn Red в качестве значений. Этот запрос может совпадать с красным на обоих. Возможно, '' filter_color ": filter_color | red, filter_color | autumn red" 'с поиском' CONTAINS (s.filter_color, "filter_color | red") 'или более простой определитель. Я попробую это и вернусь к вам. – Matty

+0

Я добавил поле, которое содержит только весь фильтр и значения. Данные полей выглядят следующим образом: '' | filter_color | red |, | filter_color | autumn red | ... "' Я помещаю трубы вокруг полей, что упрощает сборку без проблем с совпадениями. Кроме того, у меня есть только одно дополнительное поле, которое просто используется для этого. Безумно быстро. – Matty

Смежные вопросы