从 cloudant 查询中获取最新的(时间戳明智的)值
Getting the latest (timestamp wise) value from cloudant query
我有一个 cloudant 数据库,其中每个文档如下所示:
{
"_id": "2015-11-20_attr_00",
"key": "attr",
"value": "00",
"employeeCount": 12,
"timestamp": "2015-11-20T18:16:05.366Z",
"epocTimestampMillis": 1448043365366,
"docType": "attrCounts"
}
对于给定的属性,有一个员工人数。如您所见,我每天都有相同属性的记录。我正在尝试创建一个视图或索引,以便为我提供该属性的最新记录。这意味着如果我在 2015-10-30 插入一条记录,在 2015-11-10 插入另一条记录,那么返回给我的只是时间戳为 2015-11-10 的记录的员工人数。
我已尝试查看,但我得到的是每个属性的所有条目,而不仅仅是最新的。我没有查看索引,因为我认为它们没有得到预先计算。我将从客户端查询这个,所以预先计算它(就像视图一样)很重要。
任何指导将不胜感激。谢谢
我创建了一个测试数据库,您可以在这里看到。只要确保当您将 JSON 文档插入 Cloudant(或 CouchDB)时,您的时间戳不是字符串而是 JavaScript 数据对象:
https://examples.cloudant.com/latestdocs/_all_docs?include_docs=true
我建立了一个这样的搜索索引(命名设计文档 "summary" 和搜索索引 "latest"):
function (doc) {
if ( doc.docType == "totalEmployeeCounts" && doc.key == "div") {
index("division", doc.value, {"store": true});
index("timestamp", doc.timestamp, {"store": true});
}
}
那么这里的查询将 return 仅显示每个部门的最新记录。请注意,限制值将应用于每个组,因此 limit=1,如果有 4 个组,您将获得 4 个文档而不是 1 个。
https://examples.cloudant.com/latestdocs/_design/summary/_search/latest?q=*:*&limit=1&group_field=division&include_docs=true&sort_field=-timestamp
不建议将时间戳作为字符串编制索引。
参考:
https://cloudant.com/blog/defensive-coding-in-mapindex-functions/#.VvRVxtIrJaT
我也遇到了同样的问题。我将时间戳值转换为毫秒(数字),然后索引该值。
var millis= Date.parse(timestamp);
index("millis",millis,{"store": false});
您可以使用与 Raj 建议相同的查询,但使用 'millis' 字段而不是时间戳。
我有一个 cloudant 数据库,其中每个文档如下所示:
{
"_id": "2015-11-20_attr_00",
"key": "attr",
"value": "00",
"employeeCount": 12,
"timestamp": "2015-11-20T18:16:05.366Z",
"epocTimestampMillis": 1448043365366,
"docType": "attrCounts"
}
对于给定的属性,有一个员工人数。如您所见,我每天都有相同属性的记录。我正在尝试创建一个视图或索引,以便为我提供该属性的最新记录。这意味着如果我在 2015-10-30 插入一条记录,在 2015-11-10 插入另一条记录,那么返回给我的只是时间戳为 2015-11-10 的记录的员工人数。
我已尝试查看,但我得到的是每个属性的所有条目,而不仅仅是最新的。我没有查看索引,因为我认为它们没有得到预先计算。我将从客户端查询这个,所以预先计算它(就像视图一样)很重要。
任何指导将不胜感激。谢谢
我创建了一个测试数据库,您可以在这里看到。只要确保当您将 JSON 文档插入 Cloudant(或 CouchDB)时,您的时间戳不是字符串而是 JavaScript 数据对象:
https://examples.cloudant.com/latestdocs/_all_docs?include_docs=true
我建立了一个这样的搜索索引(命名设计文档 "summary" 和搜索索引 "latest"):
function (doc) { if ( doc.docType == "totalEmployeeCounts" && doc.key == "div") { index("division", doc.value, {"store": true}); index("timestamp", doc.timestamp, {"store": true}); } }
那么这里的查询将 return 仅显示每个部门的最新记录。请注意,限制值将应用于每个组,因此 limit=1,如果有 4 个组,您将获得 4 个文档而不是 1 个。
https://examples.cloudant.com/latestdocs/_design/summary/_search/latest?q=*:*&limit=1&group_field=division&include_docs=true&sort_field=-timestamp
不建议将时间戳作为字符串编制索引。
参考: https://cloudant.com/blog/defensive-coding-in-mapindex-functions/#.VvRVxtIrJaT
我也遇到了同样的问题。我将时间戳值转换为毫秒(数字),然后索引该值。
var millis= Date.parse(timestamp);
index("millis",millis,{"store": false});
您可以使用与 Raj 建议相同的查询,但使用 'millis' 字段而不是时间戳。