2016-11-21 1 views
1

У меня есть ионное приложение, которое хранит данные в локальном PouchDB.Создание сложных фильтров с CouchDB

Мои магазины базы данных документов, как в этом примере:

{ 
    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, чтобы найти ocurrencies только в определенную дату. Он может выбрать фильтр все одним Category и так далее.

Он может создать любую комбинацию из этих 4-х элементов, как:

[Timestamp,Category] 
[Timestamp,Place] 
[Category,Place] 
[Timestamp,Responsible] 
... 

Я всегда заказывать обратно на Timestamp, но это не проблема.

Проблема заключается в том, что я не могу найти какую-либо функцию Map, которая может дать такой тип гибкости ...

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

Невозможно, чтобы я был первым, кто пытался это сделать.

Спасибо за помощь!

ответ

2

Я не думаю, что есть способ сделать такие фильтры в Couchdb, так как нет никакого способа сделать это в других NoSQL dbs. Даже для баз данных SQL, если у вас есть индекс на [Timestamp,Category,Place,Responsible], вы не можете использовать его для поиска [{},{},Place,Responsible].

Вы можете рассмотреть возможность использования полного поиска по времени для CouchDB, где вы можете указать любые комбинации полей для поиска в любом порядке: https://github.com/cloudant-labs/clouseau https://github.com/cloudant-labs/dreyfus

Протест здесь является то, что поиск получает только первые 200 записей, после чего вам нужно уволить дополнительные запросы для разбивки на страницы с результатами, сохраняя неизменную базу данных.

 Смежные вопросы

  • Нет связанных вопросов^_^