Couchdb:是否可以从另一个视图中查询视图?

时间:2015-02-24 18:49:44

标签: javascript mapreduce couchdb

我有一个CouchDB数据库,其中包含以下类型的文档,表示在建筑物内发生的事件:

{ person: 1
  timestamp: 1
  event: { type: enter
           room: b }
}

{ person: 2
  timestamp: 5
  event: { type: leave
           room: b }
}

我想解决的问题如下:我想知道每个人和同一个人在同一房间里度过的总时间。请注意,任何人都可以在很多不同时间进出许多房间。老实说,我不知道MapReduce是否是最好的范例,或者我是否应该只导出我的数据并编写一个单独的脚本来解决这个问题(虽然这对我们的生产环境来说可能不是一个可行的解决方案)。

作为一个起始解决方案,我们假设所有数据都是合理的,因此进入房间的人也会在以后离开该房间。但是,在最终解决方案中,可能必须放宽此要求,因为某些事件可能会丢失。

我已经想到了一个潜在的解决方案,但我不知道这是否完全可行或者如何在couchdb中执行此操作。这是一个大纲。

  1. 为每个进入房间事件的人创建一个发出以下格式的视图:

    { [room, person, timestamp], null }

  2. 创建一个视图,每当第1个人退出房间时,该视图就会发出{ [room, timestamp], null}(可能适用于所有人,但不是必需的)。

  3. 创建一个视图,针对除了人1之外的任何人退出房间事件,执行以下操作。在映射步骤中:

    • 查询第一个视图以查找该人进入房间时的最后一个时间戳。
    • 查询第一个视图,以便在退出第1个人进入该房间的房间事件之前查找所有时间
    • 对于每个时间,查询第二个视图以查找该房间的所有退出时间,并且每个间隔检查重叠的内容。
    • 将这些重叠加在一起并发出{ person, time }
  4. 降低:     对于每个人,总是把所有时间都加在一起。

    然而,这依赖于我能够弄清楚如何从视图中查询不同的视图。有人知道这是否可能,如果可能,怎么做?

1 个答案:

答案 0 :(得分:0)

我在CouchDB结构中找到的唯一方法是使用list函数。我创建了一个视图,只需将[building,timestamp]作为键发出所有文档。这有助于我查询视图以确保我有一天和一个单独的建筑,使用startkey和endkey。

我现在创建一个列表函数,它简单地获取视图返回的所有文档,并在javascript函数中执行处理。这在很大程度上绕过了map-reduce框架,但这是我在CouchDB框架中想到这一点的唯一方法。显然,使用CouchDB的RESTful API,可以使用任何其他脚本而不是list函数完成相同的操作。