2016-11-21 33 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來僅在特定日期搜索貨幣。他可以通過單一的Category等選擇過濾器。

他可以創建這些4種元素的任意組合,如:

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

我總是要通過Timestamp成反比訂貨,但這不是問題。

的問題是,我無法找到任何地圖功能,可以給該類型的靈活性......

我知道,如果用戶必須填寫所有過濾器,我可以很容易地使用這個地圖功能:

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分的記錄,之後您需要激發額外的請求以通過結果分頁,同時保持數據庫不被修改。