【发布时间】:2012-05-10 00:29:07
【问题描述】:
我正在为我的应用程序实现过滤器功能,但在 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}
那么如何建模filter和写view呢?
过滤器可能是这样的:
{"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 中写出等价的东西。
【问题讨论】:
-
对于具有多个任意字段的过滤器,您最好通过couchdb-lucene查看全文索引
-
@DominicBarnes 谢谢!我更新了我的问题以使其更清楚。一个过滤器仅适用于一个字段。例如。在上面的示例中,位置过滤器永远不会与 start-epoch 过滤器混合使用。
-
那么,您是否尝试根据“过滤”文档生成视图/索引?
-
@DominicBarnes 是的。我的 Session 架构无法更改,但我尚未决定我的过滤器文档架构,因此它很灵活。
-
您不能根据您的文档动态生成视图索引,并且不应在生产环境中使用“临时视图”。这些“过滤器”是您的用户生成的吗?如果是这样,您需要根据要过滤的字段创建一个 map/reduce 视图,并使用 _list 查询后处理根据一些查询字符串参数运行实际过滤器。
标签: database-design join view couchdb mapreduce