使用时间戳过滤减少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