CouchDB:查询具有时间框架的复杂键的减少值



应用程序用户可以执行不同的任务。每种任务都有唯一的标识符。每个用户活动都记录到数据库中。

因此,我们有以下事件实体要保存在数据库中:

{
    "user_id": 1,
    "task_id": 2,
    "event_dt": [
        2013, 11, 15, 10, 0, 0, 0
    ]
}

我需要知道在特定的时间段内,每种类型的任务由特定的用户执行了多少。时间框架可能相当长(即要求提供去年的滚动图表)。

为了更好地理解,映射函数可能类似于:

emit([doc.user_id, doc.task_id, doc.event_dt], 1)

并且可以使用CCD_ 1(或者在仅需要多个用户事件的情况下使用group_level=1)来查询它。

是否可以通过使用map/reduce机制进行单视图查询来回答上述问题?我必须使用列表功能吗(尽管这可能会导致性能问题)?

只需使用平面键[doc.user_id, doc.task_id].concat(doc.event_dt),因为它将简化请求和分组逻辑:

  • 使用group_level=1:您将获得每个用户在所有时间内的任务量
  • 其中group_level=2:每个用户在所有时间内的特定任务ID的数量
  • group_level=3:与上述相同,但在特定年份的上下文中
  • group_level=4相同,但也按月份分组按天、小时、分钟和秒

例如,group_level=3的结果可能是:

{"rows":[
    {"key": ["user1", "task1", 2012], "value": 3},
    {"key": ["user1", "task2", 2013], "value": 14},
    {"key": ["user1", "task3", 2013], "value": 15},
    {"key": ["user2", "task1", 2012], "value": 9},
    {"key": ["user2", "task4", 2012], "value": 26},
    {"key": ["user2", "task4", 2013], "value": 53},
    {"key": ["user3", "task1", 2013], "value": 5}
]}

最新更新