Cloudant:在多个级别进行过滤和聚合

Cloudant: Filtering and aggregation at multiple levels

我在 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。但是,其中 none 足够灵活,可以在多个级别进行过滤和聚合。

例如,我想根据品牌和型号进行过滤,然后在州或城市级别进行汇总。在另一种情况下,我想根据州、城市、品牌和型号进行过滤,并在月份级别进行汇总(使用 usedOn)。

非常感谢任何帮助。

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

假设您要查找使用的能源并通过制作模型过滤并在州或城市聚合,您可以定义以下地图:

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

reduce 函数只是内置的 _sum 函数。

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

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

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

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

一开始对我来说很难的一件事是打破 'relational' 的思维方式 - 从 SQL 世界切换到 doc dbs 和 map/reduce 世界需要一个不同的数据和查询建模方法。