Cloudant:多级过滤和聚合

时间:2016-05-30 06:09:15

标签: couchdb cloudant

我在cloudant中有一个文档集

{
    "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)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

通过定义正确的视图(map / reduce函数),您可以实现很多目标。

假设您想要查找使用的能源并按州和城市的模型和汇总进行过滤,您可以定义以下地图:

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

reduce函数只是内置的_sum

现在通过特定品牌和型号进行查询并调整组级别以进行缩减,您将能够获得每个make_model使用的能量,然后按州拆分,然后按城市进一步拆分。

如果您只想按州和城市进行分组,只需定义一个不带键的make_model部分的不同视图。

你不能有一个视图来实现所有,沙发dB不是RDB。你需要一个不同的方法。

您的其他查询可能需要定义稍微不同的map / reduce函数,但所有这些都是可以实现的。

最初对我来说困难的一件事是打破“关系”思维方式 - 从SQL世界转换为doc dbs和map / reduce world需要一种不同的数据和查询建模方法。