CouchDB _changes-API филтър

Опитвам се да накарам филтриран _changes-API поток на CouchDB 2.1.1 да работи, но срещам проблеми. Искам да получавам само документи чрез канала за промени, които съдържат полето „тип“ със стойност „статия“.

Според документацията нещо подобно трябва да работи:

function (doc, req) {
  if (doc.type && doc.type == 'article') {
    return true;
  }
  return false;
}

Създадох функцията по-горе в нов изглед, наречен type_article в _дизайн документ, наречен filters, използвайки Fauxton. Когато щракна върху изгледа, не виждам никакви резултати там.

Сега искам да извлека филтрирания канал за промени от DB, като използвам филтъра като GET-параметър: localhost:5984/my_database/_changes?filter=filters/type_article

Отговорът на CouchDB е {"error":"not_found","reason":"missing json key: filters"}

Имате ли идея как мога да накарам филтърната функция да работи?

PS: Опитах също да използвам функцията 'emit()' вместо връщане на true и false, това върна очакваните резултати, но при опит за заявка _changes се появи същата грешка.


person Philip Koch    schedule 05.02.2018    source източник


Отговори (2)


Само бележка, всъщност можете да използвате изглед като филтър за _changes. В този случай документът се счита за преминал, ако функция за карта излъчва поне един запис за него.

Например, ако проектен документ (наречен „ddoc“) изглежда по следния начин:

{"views":
    {"type_article":
        {"map":
            "function(doc) {
                if (doc.type && doc.type == 'article') {
                    emit(doc.name);
                }
            }"
        }
    }
}

Тогава една заявка ще изглежда като localhost:5984/my_database/_changes?filter=_view&view=ddoc/type_article. Обърнете внимание на липсващ префикс _design и ключова дума _view за атрибут filter. Ето връзка към съответния раздел с документация: [връзка ]

Единственото нещо, което трябва да знаете тук е, че този филтър всъщност не използва вграден индекс на изглед и следователно не е по-бърз от обикновена филтърна функция.

person eiri    schedule 07.02.2018
comment
Много интересно! Благодаря за споделянето! - person Philip Koch; 08.02.2018

Открих проблема. Когато създавате изглед във Fauxton, като използвате малък знак + до записа в менюто Design Documents, можете да създавате само изгледи. Изгледите са различни от филтрите. За да създадете филтър, който работи с емисията _changes, щракнете върху „Създаване на документ“ и създайте документ като този:

{
  "_id": "_design/filters",
  "filters": {
    "type_article": "function (doc, req) {\n  if (doc.type && doc.type == \"article\") {\n    return true;\n  } else { \n return false; \n}\n}"
  }
}

Това ще създаде нов проектен документ, наречен filters с функция type_article.

person Philip Koch    schedule 05.02.2018