使用时间戳过滤减少CouchDB计数
假设我有这样的文件:使用时间戳过滤减少CouchDB计数,couchdb,cloudant,Couchdb,Cloudant,假设我有这样的文件: { _id: "a98798978s978dd98d", type: "signature", uid: "u12345", category: "cat_1", timestamp: UNIX_TIMESTAMP } 我的目标是能够统计由某个uid创建的所有签名,但能够根据时间戳进行过滤 多亏了,我通过减少计数功能实现了这一目标: function (doc) { if (doc.type === "signature") {
{
_id: "a98798978s978dd98d",
type: "signature",
uid: "u12345",
category: "cat_1",
timestamp: UNIX_TIMESTAMP
}
我的目标是能够统计由某个uid
创建的所有签名
,但能够根据时间戳进行过滤
多亏了,我通过减少计数功能实现了这一目标:
function (doc) {
if (doc.type === "signature") {
emit([doc.uid, doc.timestamp], 1);
}
}
请回答以下问题:
start_key=[null,lowerTimestamp]
end_key=[{},higherTimestamp]
reduce=true
group_level=1
答复:
{
"rows": [
{
"key": [ "u11111" ],
"value": 3
},
{
"key": [ "u12345" ],
"value": 26
}
]
}
它正确计数uid
,但过滤器工作不正常。起初我认为这可能是一个CouchDB 2.2错误,但我尝试了Cloudant,得到了相同的响应
有人知道我如何让ale过滤时间戳吗?在MapReduce中使用复合键(即键是一个事物数组)时,无法查询缺少“前导”数组元素的键范围。i、 您可以查询一系列UUID并按时间戳排序结果,但您的用例正好相反—您希望按时间查询UUID 我很想把时间放在数组的第一位,但是unix时间戳不适合分组;)。我不知道应用程序的详细信息,但如果您要索引日期而不是时间戳,如下所示:
function (doc) {
if (doc.type === "signature") {
var date = new Date(doc.timestamp)
var datestr = date.toISOString().split('T')[0]
emit([datestr, doc.uuid], 1);
}
}
这将允许您查询一系列日期(以一整天的分辨率):
尽管你的UUID是按天分组的。哇,把它变成约会真是个好主意。谢谢你。如果我在某一天需要它,这是非常棒的,但是开始键和结束键很可能是按月或按年。如果不发送包含我想要的所有UID的查询帖子,这似乎是不可能的。
?startkey=["2018-01-01"]&endkey=["2018-02-01"]&group_level=2