Запросы CouchDB "Mango", в которых используется оператор $ne
(не равно), имеют тенденцию вызывать проблемы с производительностью из-за способа индексации. Одним из решений является создание и индексирование, которое * содержит только те документы, в которых name
не равно null
, с помощью новой относительной функции частичного индекса в CouchDB.
Частичные индексы позволяют фильтровать базу данных в время индекса , так что встроенный индекс содержит только документы, которые проходят указанный тест фильтрации. Затем индекс можно использовать с запросом в время запроса для дальнейшего отвода данных.
Индекс создается путем вызова конечной точки /db/_index
:
POST /db/_index HTTP/1.1
Content-Type: application/json
Content-Length: 144
Host: localhost:5984
{
"index": {
"partial_filter_selector": {
"name": {
"$ne": "null"
}
},
"fields": ["_id", "_rev", "name", "email"]
},
"ddoc": "mypartialindex",
"type" : "json"
}
При этом создается индекс, в который включаются только документы, для которых name
не равно нулю. Затем мы можем указать этот индекс во время запроса:
{
"selector": {
"name": {
"$ne": "null"
}
},
"use_index": "mypartialindex"
}
В приведенном выше запросе мой selector
выбирает все записи, но индекс, к которому он обращается, уже отфильтрован. Вы можете добавить дополнительные пункты к селектору здесь для дальнейшей фильтрации данных во время запроса.
Частичное индексирование описано в документации CouchDB здесь и в этом сообщении в блоге .