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

Couchdb: is it possible to query a view from within another view?

我有一个 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 }

减少: 对于每个人,将所有时间加在一起。

但是,这取决于我是否能够弄清楚如何从一个视图中查询不同的视图。有人知道这是否可行吗?如果可行,怎么做?

我发现在 CouchDB 结构中执行此操作的唯一方法是使用列表函数。我创建了一个视图,它简单地发出所有以 [building, timestamp] 作为键的文档。这有助于我查询视图,以确保我有一天和一栋建筑,以及开始键和结束键。

我现在创建一个列表函数,它只获取视图返回的所有文档,并在 javascript 函数中执行处理。这在很大程度上绕过了 map-reduce 框架,但这是我能想到的在 CouchDB 框架内执行此操作的唯一方法。显然,使用 CouchDB 的 RESTful API.

任何其他脚本而不是列表函数也可以完成相同的操作