2015-02-24 109 views
1

我有以下类型的文档的CouchDB数据库,表示在建筑物内发生的事件:Couchdb:是否可以从另一个视图中查询视图?

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

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

,我要解决的问题是:我想要知道每个其他人在同一个房间里与人1的时间总和。请注意,任何人都可以在许多不同的时间进入和离开很多房间。我真的不知道MapReduce是否是最好的范例,或者我应该只导出数据并编写一个单独的脚本来计算这些东西(尽管这可能不是我们的生产环境的可行解决方案)。

作为一个开始的解决方案,我们假设所有的数据都是健全的,因此进入房间的人也会在稍后离开那个房间。然而,在最终的解决方案中,这个要求可能不得不放宽,因为有些事件可能会丢失。

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

  1. 创建发射以下格式中,对于每个人进入房间事件的视图:

    { [room, person, timestamp], null }

  2. 创建用于每一次的人1退出的房间发出{ [room, timestamp], null}的图(可能适用于所有人,但没有必要)。

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

    • 查询第一种观点找到最后的时间戳当人进入房间。
    • 查询第一种观点找到任何时候退出的那个人1进入那个房间
    • 对于每一个那个时代的房间时,查询第二种观点找到那个房间所有的退出时间前,和为每个间隔检查重叠是什么。
    • 琛这些重叠在一起,并发出为{ person, time }

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

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

+0

我不确定自己完全了解您的需求,但您可能想尝试使用变更Feed运行视图,以便在人员1离开时获取房间中的所有人员。然后运行你的第二个视图,这是假设你的事件被记录在同一个人的文档中。希望这可以帮助。至于你的问题,我认为你不能在视图中调用一个视图。 – twilson63 2015-02-25 11:54:17

+0

我的问题是,我想在所有事情发生后(每个人都离开大楼)这样做:我想知道人们在同一个房间里共同度过的总时间,所以虽然我可以做到(几乎:必须检查每个出口事件也是如此)与您的解决方案为每个房间,我仍然需要在最后总结他们。但是,还有第二个问题,我没有人员文件,而是事件文件。因此我必须将不同的人物ID(他们的进入和离开事件)联系起来,因此需要不同的观点(通过personID加入所有事件)。 – Acrofales 2015-02-25 13:33:37

+0

是否可以同时管理个人文档和事件文档,然后监视每个房间的事件文档的[更改]输入[输入,离开],然后在输入和每个房间退出时使用时间戳更新个人文档。并在退出时计算房间中的总时间并将其应用于人员文档。那么你应该能够创建一个视图来关闭[房间,人员,总时间]。 – twilson63 2015-02-26 14:03:47

回答

0

我发现在CouchDB结构中执行此操作的唯一方法是使用列表函数。我创建了一个视图,它只是以[building,timestamp]作为关键字发出所有文档。这有助于我查看视图,以确保我有一天和一个建筑物,使用startkey和endkey。

我现在创建一个列表函数,它只需要获取视图返回的所有文档,并在javascript函数中执行处理。这在大多数情况下绕过了map-reduce框架,但是我可以考虑在CouchDB框架内完成此操作。显然,使用CouchDB的RESTful API,可以使用任何其他脚本而不是使用列表函数来完成。

相关问题