【发布时间】:2015-02-24 18:49:44
【问题描述】:
我有一个 CouchDB 数据库,其中包含以下类型的文档,代表建筑物内发生的事件:
{ person: 1
timestamp: 1
event: { type: enter
room: b }
}
和
{ person: 2
timestamp: 5
event: { type: leave
room: b }
}
我要解决的问题如下:我想知道每个人与第 1 个人在同一个房间里的总时间。请注意,任何人都可以在许多不同的时间进出许多房间.老实说,我不知道 MapReduce 是否是最好的范例,或者我是否应该只导出我的数据并编写一个单独的脚本来解决这些问题(尽管这对于我们的生产环境来说可能不是一个可行的解决方案)。
作为一个初始解决方案,我们假设所有数据都是正常的,因此进入房间的人也会在稍后离开该房间。然而,在最终的解决方案中,这个要求可能不得不放宽,因为可能会丢失一些事件。
我已经想到了一个潜在的解决方案,但我不知道这是否可能或如何在 couchdb 中做到这一点。这是一个大纲。
-
为每个进入房间事件的人创建一个发出以下格式的视图:
{ [room, person, timestamp], null } 创建一个视图,每次人 1 离开房间时都会发出
{ [room, timestamp], null}(可能适用于所有人,但没有必要)。-
创建一个视图,对于除人员 1 之外的任何人的每个退出房间事件,执行以下操作。在映射步骤中:
- 查询第一个视图以查找该人进入房间的最后一个时间戳。
- 查询第一个视图以查找在退出房间事件之前第 1 个人进入该房间的所有时间
- 对于这些时间中的每一个,查询第二个视图以查找该房间的所有退出时间,并针对每个时间间隔检查重叠时间。
- 将这些重叠相加并作为
{ person, time }发出
减少: 对于每个人,将所有时间加在一起。
但是,这依赖于我能够弄清楚如何从视图中查询不同的视图。有谁知道这是否可行,如果可以,怎么做?
【问题讨论】:
-
我不确定我是否完全理解您的需求,但您可能想尝试使用更改提要运行一个视图,以便在第 1 个人离开时获取房间中的所有人。然后运行您的第二个视图,这是假设您的事件被记录在同一个人文档中。希望这可以帮助。至于您的问题,我认为您不能在视图中调用视图。
-
我的问题是我想在一切都发生之后(每个人都离开大楼)做:我想知道人们在同一个房间里一起度过的总时间,所以虽然我可以做(几乎:也必须检查每个退出事件)对于每个房间的解决方案,我仍然需要在最后将它们加在一起。但是,还有第二个问题,因为我没有个人文档,而是事件文档。因此,我必须将不同的人员 ID 关联在一起(他们的进入和离开事件),因此需要不同的视图(通过 personID 加入所有事件)。
-
是否可以同时管理人员文档和事件文档,然后监视每个房间的事件文档 [进入,离开] 的 _changes 提要,然后在进入和打开时使用时间戳更新人员文档每个房间的出口。并在退出时计算房间的总时间并将其应用于人员文档。然后您应该能够创建一个视图来关闭 [房间、人员、总时间]。
-
目前我什至没有个人文件。我想这可能是一个解决方案,但个人文档很快就会变得非常大:进入和离开房间并不是我们捕获的唯一事件。我现在正在寻找的解决方案是将所有处理放在一个列表函数中。我不确定这是否可行,但我会尝试并在这里报告!
标签: javascript mapreduce couchdb