Mapreduce 使用Map Reduce查询Cloudant在24小时内创建的文档数。
我想使用IBMCloudant数据库的MapReduce过程计算24小时内创建的文档数量。以下是我的Map Reduce代码:Mapreduce 使用Map Reduce查询Cloudant在24小时内创建的文档数。,mapreduce,cloudant,Mapreduce,Cloudant,我想使用IBMCloudant数据库的MapReduce过程计算24小时内创建的文档数量。以下是我的Map Reduce代码: function (doc) { docTime = (new Date(doc.created_at)).getTime(); currentTime = (new Date()).getTime(); if ((86400000 - (currentTime - docTime)) > 0) { emit(doc.d
function (doc) {
docTime = (new Date(doc.created_at)).getTime();
currentTime = (new Date()).getTime();
if ((86400000 - (currentTime - docTime)) > 0) {
emit(doc.deviceID, 1);
}
}
在reduce阶段,我使用count函数来获得文档的总数。但是,值currentTime在第一次构建Map Reduce时被视为使用,而不是针对每个查询进行更新
如果能收到任何克服这些问题的建议,那就太好了
非常感谢。我认为您在这里有一些选择,但我不认为视图是其中之一。我认为视图仅在插入/更新时计算 您的第一个选择是使用Cloudant查询。您可以在
created_at
字段上创建索引,并使用以下选择器:
"selector": {
"$and": [
{"created_at" : { "$gt": 1506874127 }},
{"created_at": { "$lt": 1506960651 }}
]
}
这样做的问题是,您必须循环并计算所有条目。另一种方法是使用Cloudant搜索。在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\u field=device\u id
,以按设备id对结果进行分组。例如
https://.cloudant.com//_design/allDocs/_search/byCreatedAt?q=created_at%3A[1506874127%20至%20150690651]&组字段=设备id和限制=1
这里的搜索查询是:
创建地址:[1506874127至1506960651]
我正在使用unix时间戳。我相信你也可以使用日期字符串。我还将限制设置为1。这将只返回每个组中的第一个条目,因为您只需要总计数(分组查询不允许limit=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。我认为您在这里有一些选项,但我不认为视图是其中之一。我认为视图仅在插入/更新时计算
您的第一个选择是使用Cloudant查询。您可以在created_at
字段上创建索引,并使用以下选择器:
"selector": {
"$and": [
{"created_at" : { "$gt": 1506874127 }},
{"created_at": { "$lt": 1506960651 }}
]
}
这样做的问题是,您必须循环并计算所有条目。另一种方法是使用Cloudant搜索。在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\u field=device\u id
,以按设备id对结果进行分组。例如
https://.cloudant.com//_design/allDocs/_search/byCreatedAt?q=created_at%3A[1506874127%20至%20150690651]&组字段=设备id和限制=1
这里的搜索查询是:
创建地址:[1506874127至1506960651]
我正在使用unix时间戳。我相信你也可以使用日期字符串。我还将限制设置为1。这将只返回每个组中的第一个条目,因为您只需要总计数(分组查询不允许limit=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。也有类似问题。。。刚刚在我保存到cloudant的JSON文档中添加了创建时间。然后基于它创建了一个视图。有一个类似的问题。。。刚刚在我保存到cloudant的JSON文档中添加了创建时间。然后基于它创建了一个视图。非常感谢您的评论。在计算每个设备(由文档中的deviceID标识)的文档数(如分组操作)时,我需要设置什么?再次谢谢你,我错过了你问题的分组部分。请看修改后的答案。注意:搜索索引和查询都已更改。非常感谢您的帮助。在按cloudant搜索的设备id分组的情况下,cloudant仅限制每个请求10个组。这意味着如果我们的数据库有100台设备。这将是不可能的,或者再次导致循环查询。你对此有什么建议吗?非常感谢您的帮助不幸的是,我认为您将不得不翻阅结果。我发现另一种方法是使用“计数”来解决它。非常感谢您的帮助非常感谢您的评论。在计算每个设备(由文档中的deviceID标识)的文档数(如分组操作)时,我需要设置什么?再次谢谢你,我错过了你问题的分组部分。请看修改后的答案。注意:搜索索引和查询都已更改。非常感谢您的帮助。在按cloudant搜索的设备id分组的情况下,cloudant仅限制每个请求10个组。这意味着如果我们的数据库有100台设备。这将是不可能的,或者再次导致循环查询。你对此有什么建议吗?非常感谢您的帮助不幸的是,我认为您将不得不翻阅结果。我发现另一种方法是使用“计数”来解决它。非常感谢你的帮助