我认为您在这里有几个选择,但我不认为视图是其中之一。我相信视图仅在插入/更新时计算。
您的第一个选择是使用 Cloudant Query。您可以在 created_at 字段上创建索引并使用以下选择器:
"selector": {
"$and": [
{"created_at" : { "$gt": 1506874127 }},
{"created_at": { "$lt": 1506960651 }}
]
}
这样做的问题是您必须遍历并计算所有条目。另一种方法是使用 Cloudant Search。在 Cloudant 中创建类似于以下内容的搜索索引:
{
"_id": "_design/allDocs",
"views": {},
"language": "javascript",
"indexes": {
"byCreatedAt": {
"analyzer": "standard",
"index": "function (doc) {\n if (doc.created_at && doc.device_id) {\n index(\"created_at\", doc.created_at);\n index(\"device_id\", doc.device_id);\n }\n}"
}
}
}
在使用 Cloudant 仪表板时,这对应于以下内容:
设计文档 = allDocs
索引名称 = byCreatedAt
索引函数 =
function (doc) {
if (doc.created_at && doc.device_id) {
index("created_at", doc.created_at);
index("device_id", doc.device_id);
}
}
然后您可以使用范围运行搜索 - 其中范围是 24 小时前到现在的时间 - 并指定 group_field=device_id 以按设备 ID 对结果进行分组。例如,
https://<YOUR_INSTANCE>.cloudant.com/<YOUR_DB>/_design/allDocs/_search/byCreatedAt?q=created_at%3A[1506874127%20TO%201506960651]&group_field=device_id&limit=1
这里的搜索查询是:
created_at:[1506874127 TO 1506960651]
我使用的是 unix 时间戳。我相信你也可以使用日期字符串。我还将限制设置为 1。这将只返回每个组中的第一个条目,因为您只需要总计数(分组查询不允许限制 = 0)。这是一个示例结果:
{
"total_rows":3,
"groups":[
{
"by":"1",
"total_rows":2,
"rows":[
{
"id":"263a81ea76528dead3a4185df3676f62",
"order":[
1.0,
0
],
"fields":{
}
}
]
},
{
"by":"2",
"total_rows":1,
"rows":[
{
"id":"d857ac5c58eebde4c21ffdcf3e0fd321",
"order":[
1.0,
0
],
"fields":{
}
}
]
}
]
}
by 字段是设备 ID。