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

Couchdb Cloudant:在多个级别进行过滤和聚合,couchdb,cloudant,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 } 我

我在cloudant有一个文档集

{
    "id" : String

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

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

    "usedOn": Date
    "energyUSed": int
    "durationUsed": int
}
我想过滤多个标准-国家,城市,zipcode,品牌,型号,sku等和总能量和持续时间使用

我研究了使用map/reduce、查询索引和_findtarget查询cloudant。然而,这些都不够灵活,无法在多个级别进行过滤和聚合

例如,我想基于make和model进行过滤,并在州或城市级别进行聚合。在另一种情况下,我想根据州、城市、品牌和型号进行过滤,并在月份级别进行聚合(使用usedOn)


非常感谢您提供的任何帮助。

通过定义正确的视图(map/reduce函数),您可以获得很多帮助

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

var makeModelKey = doc.make + '_' + doc.model;
emit([makeModelKey, doc.state, doc.city], doc.energyUsed);
reduce函数只是内置的
\u sum
函数

现在,通过特定的make和模型查询并调整组级别以减少,您将能够获得每个make_模型使用的能量,然后按州划分,然后按城市进一步划分

如果只想按州和城市分组,只需定义一个不同的视图,而不需要键的make_模型部分

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

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


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

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

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

var makeModelKey = doc.make + '_' + doc.model;
emit([makeModelKey, doc.state, doc.city], doc.energyUsed);
reduce函数只是内置的
\u sum
函数

现在,通过特定的make和模型查询并调整组级别以减少,您将能够获得每个make_模型使用的能量,然后按州划分,然后按城市进一步划分

如果只想按州和城市分组,只需定义一个不同的视图,而不需要键的make_模型部分

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

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


一开始,我很难摆脱“关系”思维方式——从SQL世界切换到doc dbs和map/reduce世界需要一种不同的数据和查询建模方法。

感谢您的评论。假设我们使用上面的复数键,对于过滤,我们需要使用startKey和endKey。问题是,如果我想让所有make+模型都使用能量,但想在state或city上进行过滤,我不能在startKey或endKey中使用通配符,比如startKey=[,'A',{}]和endKey=[,'Z',{}]。任何想法或建议都将不胜感激。谢谢您的评论。假设我们使用上面的复数键,对于过滤,我们需要使用startKey和endKey。问题是,如果我想让所有make+模型都使用能量,但想在state或city上进行过滤,我不能在startKey或endKey中使用通配符,比如startKey=[,'A',{}]和endKey=[,'Z',{}]。如有任何想法或建议,我们将不胜感激。