couchbase фильтрует несколько полей

Я пытаюсь разработать лучший способ фильтрации нескольких полей в CouchBase, когда значения, которые я фильтрую, не являются смежными. Например, если бы у меня была таблица под названием Продукт со следующими полями:

  • Идантификационный номер продукта

  • CategoryId

  • ProductTypeId

  • Цена

И я пытаюсь создать такой фильтр:

SELECT  * FROM Product WHERE CategoryID IN (1,5,7) AND ProductTypeId
IN (10, 12);

Лучший способ сделать это - иметь представление для каждого поля, запускать IN как запрос с использованием ключей (например, by_categoryId?keys=[1,5,7]), а затем вставлять результаты в код приложения? Или есть способ лучше? (Я не думаю, что могу использовать запрос диапазона, поскольку элементы массива не будут смежными).


person MarkJ    schedule 01.07.2013    source источник


Ответы (2)


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

Поддержка геопространственных данных была представлена ​​в качестве экспериментальной функции в Couchbase Server 2.0. Эта функция в настоящее время не поддерживается и предоставляется только в целях демонстрации и тестирования.

Итак, первый вариант: получить записи из couchbase, отфильтрованные по одному полю, которые дают меньше результатов, а затем на стороне приложения вы можете отфильтровать результаты по другому полю.

Второй вариант: вы можете создать пары, такие как «CategoryID: ProductTypeID» (т.е. 1:10, 1:12, 5:10, 5:12, 7:10, 7:12) на стороне приложения, и создать представление, которое также генерирует эти пары (например, emit(doc.catId + ":" + doc.prodTypeId)), и запросить его.

Третий вариант (предпочитаю я): использовать для этого реляционную базу данных. Я насчитал 3 отношения в вашем Product с 4 полями - это 75%, у вас есть реляционная модель данных! А определение NoSQL - это Базы данных следующего поколения, в основном обращающиеся к некоторым пунктам: быть нереляционными, распределенными, с открытым исходным кодом и горизонтально. масштабируемый. Или, может быть, вы можете изменить свою модель данных ...

person m03geek    schedule 01.07.2013

Вы можете использовать новый язык запросов N1Q1 от Couchbase (v3). Вы можете выразить все ваши условия "WHERE" в запросе без создания какого-либо представления.

Попробуйте интерактивное руководство по N1QL

person user1697575    schedule 10.09.2014
comment
Хотя это будет правильный ответ в будущем, N1QL отсутствует в текущей версии сервера couchbase. Будем надеяться, что функция вторичного индекса, которая будет поставляться с N1QL, также поможет решить эту проблему. - person captncraig; 03.11.2014