我要求根据期间过滤一些记录,例如让我在201704和201705之间计算所有产品。
所以我的发射是这样的:
emit([doc.productId, doc.period],1)
和reduce使用的是_count
。但是当我尝试过滤startkey和endkey时,它会给我所有记录。我正在尝试类似的事情:
startkey=["201604"]&endkey=[{},"201605"]
我的密钥结构类似于密钥:
[
"aws-60826348802",
201703
]
我不想颠倒键中元素的顺序,因为我希望通过定义group_level=1
来计算ID。任何人都可以帮助我。我还没有得到任何解决方案。
答案 0 :(得分:1)
为了能够选择(使用startkey / endkey),您的索引需要按顺序 。让我们说你的文档看起来像这样:
{
"_id": "someid",
"product": "aws-60826348802",
"date": "201604",
"price": 42.42
}
你可以创建一个map函数来按日期顺序索引文档,如下所示:
function(doc) {
emit([doc.date, doc.product], doc.price);
}
您现在拥有一个二维密钥(日期和产品代码),并且发出的价值就是价格。
这允许您按日期选择项目:
?startkey=["201604"] // find items where the date is >= 201604
?startkey=["201604"]&endkey=["201605"] // find items in April 2016
如果您选择reducer(_count,_sum或_stats),您还可以执行聚合:
?startkey=["201601"]&endkey=["201701"]&group_level=1 // find items in 2016, group by month
?startkey=["201601"]&endkey=["201701"]&group_level=2 // find items in 2016, grouped by month and product code
例如,这可以获得每月产品销售总额。