我有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"
}
答案 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
}
]
}
属性,因此您的视图定义不会返回文档。我上面的回答假定该属性是在文档中定义的。