【问题标题】:Cloudant: Filtering and aggregation at multiple levelsCloudant:多层次的过滤和聚合
【发布时间】:2016-06-03 19:15:47
【问题描述】:

我在 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)。

非常感谢任何帮助。

【问题讨论】:

    标签: couchdb cloudant


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢 cmets。假设我们使用上面的复杂键,为了过滤,我们需要使用 startKey 和 endKey。问题是如果我想为所有品牌 + 模型获取能量,但想过滤州或城市,我不能在 startKey 或 endKey 中使用通配符,如 startKey=[, 'A', {}] 和 endKey =[,'Z',{}]。任何想法或建议表示赞赏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2011-09-09
    • 2019-03-13
    • 2011-01-26
    • 2021-06-18
    • 2013-05-08
    • 2014-12-17
    相关资源
    最近更新 更多