如何在cloudant中为distinct和cout查询创建等效视图

时间:2017-05-20 08:11:36

标签: cloudant nosql

我有1000个以下类型的文档,我想在cloudant(写一个视图)中设计一个等同于这个Mysql查询的文档:

 (SELECT 
      COUNT(DISTINCT(correlationassetid)), PERIOD 
  FROM 
      view_asset 
  WHERE 
      ((PERIOD >= '201705') AND (PERIOD <= '201705')) 
  GROUP BY 
      PERIOD 
  ORDER BY 
      PERIOD ASC)

我尝试了以下视图,但没有给出正确的结果。任何人都可以帮助我吗?

function (doc) {
  if(doc.type == "asset"){
    emit(doc.period,1);
  }

{
  "_id": "24dee0ec910e22605fe8fc4189000c56",
  "_rev": "1-d667f0b4ce3d984c0d7aafadd223674a",
  "parentName": "",
  "period": "201701",
  "providerGlobalAssetId": "",
  "cost": "5",
  "providerRegionCode": "",
  "owner": "",
  "snapshotId": "659c5f7a-35d62", 
  "correlationAssetId": "aws-6082634880291"
}

1 个答案:

答案 0 :(得分:0)

我对您的示例查询和示例文档感到有点困惑,因为存在一些不一致之处,但我会尝试根据几个假设来回答您的问题。

如果要按单个PERIOD值进行过滤,则SQL语句中不需要GROUPBY子句:

draw

定义以下设计文档

SELECT COUNT(DISTINCT(correlationassetid))
FROM view_asset 
WHERE PERIOD = '201705' 

查询视图的{ "_id": "_design/howdoi", "views": { "filter-by": { "map": "function (doc) {\n if(doc.type === \"asset\") {\n emit([doc.period, doc.correlationAssetId], 1);\n }\n}", "reduce": "_count" } }, "language": "javascript" } 请求

GET
如果您指定 https://$USER:$PASSWORD@$HOST/$DATABASE/_design/howdoi/_view/filter-by?inclusive_end=true&start_key=[%22201705%22]&end_key=[%22201705%22%2C{}]&reduce=true&group_level=2 start_key=["201705"]

应返回所需的结果。

如果在该期间内有两个文档,两个都包含相同的end_key=["201705",{}]

,则回复示例
correlationAssetId

结果集中的行数应标识指定PERIOD的 { "rows": [ { "key": [ "201705", "aws-6082634880291" ], "value": 2 } ] } s的不同数量。

两个correlationAssetId的示例结果:

correlationAssetId

P.S。您的示例文档未定义{ "rows": [ { "key": [ "201701", "aws-6082634880291" ], "value": 1 }, { "key": [ "201701", "aws-6082634880292" ], "value": 1 } ] } 属性,因此您的视图定义不会返回文档。我上面的回答假定该属性是在文档中定义的。