Как фильтровать по атрибутам документа в couchdb?

#couchdb #nosql

#couchdb #nosql

Вопрос:

Может ли кто-нибудь объяснить мне, как я могу фильтровать документы с несколькими атрибутами, используя массивы и ключи?

Например, у меня есть документ с атрибутом a, b, c и d. Я хотел бы фильтровать по выбранному пользователем значению из атрибута «a». Позже я хотел бы сузить результаты значением из атрибута «c» или, может быть, значением из атрибута из «d».

У кого-нибудь есть предложения, как элегантно выполнить эту задачу?

Ответ №1:

Предполагая, что ваш документ выглядит как:

 { 'a': 123, 'b': 456, 'c': 789, ... }
  

Вы можете создать представление, подобное этому:

 function(doc){
   emit([doc.a, doc.b, doc.c], doc)
}
  

Затем вы можете использовать параметры startkey и endkey для доступа к представлениям, ограничивая результаты определенным подмножеством:

 ...amp;startkey=[123,]amp;endkey=[123,{}] // Shows all results with doc.a=123
...amp;startkey=[123,]amp;endkey=[123,456] // Shows all results with doc.a=123 and doc.b<=456
  

Однако все элементы будут отсортированы в одном списке, и все, к чему вы когда-либо сможете получить доступ, — это подраздел этого списка. Итак, если вы хотите получить доступ к документам, где 123 <= doc.a <= 456 и doc.b между 123 и 456, вам нужно будет создать два отдельных представления, одно для doc.a и одно для doc.b, а затем ваше клиентское приложение идентифицирует документы, возвращенные обоими представлениями.