【问题标题】:How to create equivalent view in cloudant for distinct and cout query in mysql如何在cloudant中为mysql中的distinct和count查询创建等效视图
【发布时间】:2017-05-20 08:11:35
【问题描述】:

我有 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"
}

【问题讨论】:

标签: cloudant nosql


【解决方案1】:

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

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

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,则响应示例:

 {
  "rows": [
   {
    "key": [
      "201705",
      "aws-6082634880291"
    ],
    "value": 2
  }
 ]
}

结果集中的行数应标识指定 PERIOD 的 correlationAssetIds 的不同数量。

两个correlationAssetIds 的示例结果:

{
  "rows": [
    {
      "key": [
        "201701",
        "aws-6082634880291"
      ],
      "value": 1
    },
    {
     "key": [
       "201701",
       "aws-6082634880292"
     ],
     "value": 1
   }
  ]
 }

附:您的示例文档没有定义 asset 属性,因此您的视图定义不会返回该文档。我上面的回复假定该属性已在文档中定义。

【讨论】:

  • 感谢 ptitzler。是的,我错过了类型:文档中的资产(它是一个很长的文档,并且在错误地粘贴到此处时,我删除了类型属性。)
  • 通过您的上述解决方案,是的,我得到了正确的行数,(请耐心等待我可以问一些愚蠢的问题,因为我是 cloudant 的新手)有没有办法计算和显示总数响应的行数。例如,我得到的总行数为 1810,这是正确的,但我想以略低于格式的格式查看响应... {"rows":[ {"key":["201705"],"value":1810} ]}
  • 现在我如何计算行数并在响应中显示类似 {"rows":[ {"key":["201705"],"value":1810} ]}跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多