поиск или фильтрация по couchdb по массиву ключей - PullRequest
24 голосов
/ 13 марта 2012

У меня есть это в моем представлении функции:

emit([doc.address.country,doc.address.state, doc.address.city], doc);

Когда я запрашиваю запрос, мне нужно заполнить все 3 элемента массива, например:

?key=["US","NY","New York"]

, который будет производить мои записи, но скажем, например, я просто хочу вернуть все в США, например:

?key=["US"]   

или в США и Штате ...

?key=["US","NY"] 

ИЛИ ... допустим, я хочу только все записи из Нью-Йорка ... (я знаю, что ниже не работает)

?key=["","NY"]

Я не понимаю, как искать, если вы хотите оставить один из элементов массива пустым?

1 Ответ

44 голосов
/ 15 марта 2012

Первый:

key = ["US"] не будет работать с ключом массива ["US", "NY"], потому что вы ищете ключ EXACT ["US"]. Вместо этого вы должны использовать

startkey=["US"]&endkey=["US",{}] 

тогда эти ключи находятся в наборе результатов:

["DE","Bavaria","Munich"]   <---- NO ! "DE" is out of Range of startkey
["US","FL","Miami"]         <---- YES, starts with "US"
["US","NY","New York"]      <---- YES, starts with "US"
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey

Также работает:

startkey=["US","FL"]&endkey=["US","FL",{}] 

результат:

["DE","Bavaria","Munich"]   <---- NO ! "DE" is out of Range of startkey
["US","FL","Miami"]         <---- YES, starts with "US","FL"
["US","NY","New York"]      <---- NO, "US","NY" is out of Range of endkey
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey

Второе: Вы не можете иметь пробелы на левой стороне .. поэтому вы должны написать еще несколько выбросов: (вам не нужно выдавать второй и третий элемент массива, если вам не нужно запрашивать его)

просмотр "byStateCityCountry":

emit([doc.address.state, doc.address.city,address.country], doc);

просмотр "byCityStateCountry":

emit([address.city,doc.address.state, doc.address.country], doc);

просто поставьте флаг на первое место, чтобы определить тип запроса, чтобы вы могли делать все в одном представлении:

emit([1,address.country,doc.address.state, doc.address.city], doc);
emit([2,doc.address.state, doc.address.city,address.country], doc);
emit([3,address.city,doc.address.state, doc.address.country], doc);

Использование:

?startkey=[1,"US"]&endkey=[1,"US",{}]
?startkey=[2,"FL"]&endkey=[2,"FL",{}]
?startkey=[3,"Miami"]&endkey=[3,"Miami",{}]
...