Mapreduce 使用Map Reduce查询Cloudant在24小时内创建的文档数。

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

我想使用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.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台设备。这将是不可能的,或者再次导致循环查询。你对此有什么建议吗?非常感谢您的帮助不幸的是,我认为您将不得不翻阅结果。我发现另一种方法是使用“计数”来解决它。非常感谢你的帮助