Ограничены ли фильтры CouchDB фидом _changes?

Как указано здесь, с фидом _changes можно использовать следующий фильтр:

curl "$HOST/db/_changes?filter=app/important"

Теперь я пытаюсь использовать этот шаблон со стандартным доступом к представлению, например:

curl -X GET $HOST/db/_design/live_data/_view/all-comments&filter=live_data/bytag?tag=testing

я тоже пробовал? вместо &:

curl -X GET $HOST/db/_design/live_data/_view/all-comments?filter=live_data/bytag?tag=testing

Но фильтр не действует: отображаются все документы, даже те, которые не должны проверяться фильтром.

Фильтр, который я использую:

function(doc, req)
{
  for( var i in doc.tags ) {
    if(doc.tags[i] == req.query.tag) {
      return true;
    }
  }
  return false;
}
  • Я делаю что-то не так в вызовах curl?
  • Можно ли вообще использовать представления вместе с фильтрами, или фильтры ограничены фидом _changes? Я не видел примеров фильтров, кроме связанных с _changes

person blueFast    schedule 29.01.2012    source источник


Ответы (2)


Да, кажется, что фильтры ограничены только запросами _changes. Если вы хотите отфильтровать данные из представлений, вы можете использовать параметры «startkey» и «endkey» с, возможно, более сложными ключами json и/или уменьшить уровни группировки для достижения желаемых результатов.

person Antonis Anastasiadis    schedule 29.01.2012
comment
На самом деле фильтры используются в фильтрованной репликации. - person fiatjaf; 03.12.2013

Если бы это работало, на CouchDB возлагалась бы ответственность за перебор всех записей view и выполнение над ними функции filter. Это не очень хороший способ, особенно если у вас есть возможность предварительно индексировать документы с помощью представлений и массивов ключей (например, [date, tag]).

Но ничто не запрещает вам реализовать этот фильтр в собственном бэкенде. Вам нужно будет только загрузить все документы view из CouchDB, выполнить для них функцию filter и вернуться. Но это было бы не быстро.

person fiatjaf    schedule 01.12.2013