我正在为我的应用程序实现过滤器功能,并且在 CouchDB 上编写视图时遇到了麻烦。在 SQL 中,这将是一个具有多个连接的语句。如何替换 CouchDB 中的多个联接。本文涵盖单连接:http ://www.cmlenz.net/archives/2007/10/couchdb-joins 。但是,对我来说,如何将这种方法扩展到多重连接并不明显。
想象一下我的对象有十几个属性,每个属性都可以有自己的过滤器。为简单起见,我们假设它只有两个属性。如果我们能解决这个问题,我们可能可以将其扩展到任意数量的属性。
我的应用程序需要支持一堆 AND 过滤器。例如,查找位置位于(“西雅图”、“纽约”)和开始时代 >= 1336608413 的所有会话。而且我还需要保留过滤器设置。
在 SQL 中,我有两个表:Session 和 Filter。然后,我在 Session 和 Filter 表之间为每个过滤条件加入一个连接,以获取所有过滤的会话。
Session Table
location start-epoch
Seattle 1336608413
Filter Table
Name Value
location Seattle
location New York
start-epoch 1336608413
Query:
select *
from Session s
where exists (select 1 from Filter f where f.name = 'location' and f.value = s.location)
and exists (select 1 from Filter f on f.name = 'start-epoch' and s.start-epoch >= f2.value)
在 CouchDB 中:
{"type":"session", "location":"Seattle", "start-epoch":1336608413}
那么如何建模过滤器和编写视图呢?
过滤器可能是这样的:
{"type":"filter", "location":["Seattle", "New York"], "start-epoch":1336608413}
那么视图怎么写呢?
我想在 CouchDB 中实现这一点。我希望创建一个名为 FilteredSessions 的视图,并在对 Couch 的一次 http 调用中检索过滤后的会话。原因是我有 5 个不同的客户端(iOS、Android、Silverlight、Ruby on Rails 和 Windows 8),我不想重写逻辑 5 次。如果我使用 sqlite,我可以创建一个名为“FilteredView”的视图来实现这一点。我希望在 map reduce 中写出等价的东西。