如何使用startkey和endkey在cloudant中查询视图,其中key中包含两个元素?

时间:2017-05-31 07:12:02

标签: couchdb cloudant nosql

我要求根据期间过滤一些记录,例如让我在201704和201705之间计算所有产品。

所以我的发射是这样的:

emit([doc.productId, doc.period],1) 

和reduce使用的是_count。但是当我尝试过滤startkey和endkey时,它会给我所有记录。我正在尝试类似的事情:

startkey=["201604"]&endkey=[{},"201605"]

我的密钥结构类似于密钥:

[
"aws-60826348802",
201703
]

我不想颠倒键中元素的顺序,因为我希望通过定义group_level=1来计算ID。任何人都可以帮助我。我还没有得到任何解决方案。

1 个答案:

答案 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

例如,这可以获得每月产品销售总额。