2016-05-30 74 views
1

我在cloudantCloudant:過濾,多層次的聚集

{ 
    "id" : String 

    "state": String 
    "city": String 
    "zipcode": int 

    "productType": String 
    "make": String 
    "model": String 
    "sku": String 

    "usedOn": Date 
    "energyUSed": int 
    "durationUsed": int 
} 

一個文件集,我想在多個指標分析篩選 - 州,城市,郵編,製造商,型號,SKU等,並聚合energyUsed和durationUsed

我使用map/reduce,查詢索引和_find目標查看了cloudant。然而,這些都不夠靈活,無法在多個層面進行過濾和聚合。

例如,我想根據品牌和型號進行過濾,並在州或城市級進行彙總。在另一個案例中,我想根據州,城市,製作和模型進行過濾,並在月份級別進行彙總(使用usedOn)。

任何幫助,非常感謝。

回答

0

通過定義正確的視圖(地圖/縮小功能),您可以實現很多功能。

比方說,你想在州或城市尋找使用能源和過濾器的品牌型號和彙總,您可以定義如下圖:

var makeModelKey = doc.make + '_' + doc.model; 
emit([makeModelKey, doc.state, doc.city], doc.energyUsed); 

的減少函數就是內置的_sum之一。

現在通過特定品牌和型號查詢並調整組級別以減少,您將可以獲得每個make_model使用的能源,然後按狀態拆分,然後再按城市拆分。

如果您只想按州和城市進行分組,只需定義一個不含密鑰的make_model部分的不同視圖即可。

你不能有一個視圖來實現全部,沙發dB不是RDB。你需要一個不同的方法。

您的其他查詢可能需要定義略有不同的map/reduce函數,但所有這些都是可以實現的。

有一件事對我來說最初難以擺脫'關係'的思維方式 - 從SQL世界切換到doc dbs和map/reduce world需要不同的數據和查詢建模方法。

+0

感謝您的意見。假設我們使用上面的複雜鍵,進行過濾,我們需要使用startKey和endKey。問題是,如果我想爲所有make +模型獲取能量,但想過濾狀態或城市,則不能在startKey或endKey中使用通配符,如startKey = [*,'A',{}]和endKey = [ *,'Z',{}]。任何想法或建議表示讚賞。 – jaydeepva