CouchDb - Доступ к фильтрам репликации в представлении - PullRequest
2 голосов
/ 17 августа 2011

возможно ли использовать функцию фильтра репликации couchdb (http://wiki.apache.org/couchdb/Replication#Filtered_Replication), запрашивая представление, например:

... / _ вид / кандидатов? Отфильтровывать = hrtool / MyFilter

Было бы неплохо отфильтровать документы по пользовательской или пользовательской роли

Заранее спасибо

FADH

1 Ответ

1 голос
/ 17 августа 2011

Это возможно с функцией _list.

Функции списка - это код Javascript, который предварительно обрабатывает вывод представления перед отправкой его клиенту. Вы можете изменить вывод представления любым способом, например, отфильтровав некоторые строки.

function(head, req) {
  // lists.filtered: filter view output by using a replication filter.

  var ddoc = this; // A common trick to explicitly identify the design document.
  function error(reason) {
    start({"code":400, "headers":{"content-type":"application/json"}});
    send(JSON.stringify({"error":reason}));
  }

  var filter_name = req.query.filter;
  if(!filter_name)
    return error("Need filter_name parameter");

  var filter_src = ddoc.filters[filter_name];
  if(!filter_src)
    return error("Invalid filter_name: " + filter_name);

  // Not 100% sure on this, you could also use new Function(args, src);
  // In the worst-case, the couchapp tool has the !code tool to copy code.
  var filter = eval(filter_src); // Not 100% sure on this
  var row;

  start({"headers":{"content-type":"application/json"}});
  send('{"rows":[\r\n');

  var first = true;
  while(row = getRow()) {
    if(filter(row)) { // Or perhaps use include_docs=true and filter(row.doc)
      if(! first)
        send(",\r\n");
      first = false;
      send(JSON.stringify(row));
    }
  }
  send("]}\r\n");
}

Используйте этот список «фильтр», как любая функция фильтра:

GET /db/_design/example/_list/filtered/candidates?filter=myfilter&include_docs=true
...