【问题标题】:Query Cloudant the number of created documents within 24h using Map Reduce.使用 Map Reduce 查询 Cloudant 24 小时内创建的文档数。
【发布时间】:2017-10-04 02:23:43
【问题描述】:

我想使用 IBM Cloudant 数据库的 Map Reduce 进程计算 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 的 JSON 文档中。然后基于它创建了一个视图。

标签: mapreduce cloudant


【解决方案1】:

我认为您在这里有几个选择,但我不认为视图是其中之一。我相信视图仅在插入/更新时计算。

您的第一个选择是使用 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。

【讨论】:

  • 非常感谢您的评论。如果像分组操作一样统计每个设备的文档数量(由文档中的deviceID标识),我需要设置什么?再次感谢您
  • 对不起,我错过了你问题的分组部分。请参阅修改后的答案。注意:搜索索引和查询都已更改。
  • 非常感谢您的帮助。在按 cloudant 搜索的 device_id 分组的情况下,Cloudant 限制每个请求仅 10 个组。这意味着如果我们的数据库有 100 个设备。这将是不可能的或导致再次循环查询。你对此有什么建议吗?非常感谢您的帮助
  • 不幸的是,我认为您将不得不翻阅结果。
  • 我发现另一种方法是使用“计数”来解决它。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
相关资源
最近更新 更多