CouchDB:使用时间帧查询复杂密钥的减少值

时间:2013-11-18 09:28:06

标签: nosql couchdb

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

所以我们跟随Event实体保存在数据库中:

{
    "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)

可以使用group_level=2(或group_level=1查询,以防需要用户事件数量。)

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

1 个答案:

答案 0 :(得分:-1)

只需使用平键[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}
]}