Создание сложных фильтров с 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 записей, после чего вам нужно запустить дополнительные запросы для разбивки на страницы результатов, сохраняя базу данных неизменной.

Другие вопросы по тегам