2016-05-30 31 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