Создание сложных фильтров с CouchDB
У меня есть ионное приложение, которое хранит данные в своей локальной PouchDB.
Моя база данных хранит документы как этот пример:
{
Timestamp: "2016-11-17T09:35:06",
Category: "CAT_1",
Place: "House",
...
Responsible: "Foo Bar",
...
},
{
Timestamp: "2016-11-07T18:45:11",
CategoryCode: "CAT_2",
Place: "Apartment",
...
Responsible: "Bar Foo",
...
}
Моему ионному приложению нужен экран фильтра, где пользователь может выбрать любое / все эти 4 поля и применить его для фильтрации.
Так что мой пользователь приложения может выбрать только Timestamp
искать валюту только в определенную дату. Он может выбрать фильтр все по одному Category
и так далее.
Он может создать любую комбинацию из этих 4 элементов, например:
[Timestamp,Category]
[Timestamp,Place]
[Category,Place]
[Timestamp,Responsible]
...
Я всегда должен сделать заказ обратно Timestamp
Но это не проблема.
Проблема в том, что я не могу найти какую-либо функцию Map, которая может дать такой тип гибкости...
Я знаю, что если бы пользователю пришлось заполнить все фильтры, я мог бы легко использовать эту функцию карты:
map:
function (doc) {
emit([Timestamp,Category,Place,Responsible], doc.Name);
}
С этим я знаю, что могу запросить эти возможности:
[Timestamp,{}]
[Timestamp,Category,{}]
[Timestamp,Category,Place,{}]
[Timestamp,Category,Place,Responsible]
Но я не могу фильтровать только [Place,Responsible]
потому что CouchDB/PouchDB не позволяют мне ставить подстановочные знаки слева, как [{},{},Place,Responsible]
Только справа, как я показал раньше.
Я знаю, что могу создать одну Карту для каждой возможности, но сегодня у нас есть четыре фильтра, завтра может быть десять!
Могут ли некоторые из вас дать мне подсказку, что я могу сделать, чтобы покрыть это?
Я знаю, что мой опыт работы с SQL должен направить меня в неверном направлении, но я думаю, что не сложно создать сложный фильтр с NoSQL и особенно с CouchDB/PouchDB.
Невозможно, что я первый, кто пытается это сделать.
Спасибо за помощь!
1 ответ
Я не думаю, что есть способ сделать фильтры в Couchdb, как этот, поскольку нет никакого способа сделать это в других БД NoSQL. Даже для баз данных SQL, если у вас есть индекс на [Timestamp,Category,Place,Responsible]
, вы не можете использовать его для поиска [{},{},Place,Responsible]
,
Вы можете рассмотреть возможность использования полного поиска для couchdb, где вы можете указать любые комбинации полей для поиска в любом порядке: https://github.com/cloudant-labs/clouseau https://github.com/cloudant-labs/dreyfus
Предостережение заключается в том, что поиск извлекает только первые 200 записей, после чего вам нужно запустить дополнительные запросы для разбивки на страницы результатов, сохраняя базу данных неизменной.