我在 rails 和 couchdb 上使用 ruby,但我在 couchdb 中的 View 有问题
在 sql 我想要:
select * from user where username = ... or email = ... and status = ...
我如何创建这样的 View ?
最佳答案
该查询是您数据的 连接 。 (不,它不是实际的 JOIN
语句,但我的意思是,您提出了 3 个不同的问题,并在答案中“加入”了结果。)
解决方案1:只需查询多次。
假设您创建了 2 个 View ,值是 status
,键是这样的:
by_username
by_email
保留 map (Java)、字典 (Python)、哈希 (Perl)、对象 (Javascript) 或任何您的键/值数据结构。您希望保留一组匹配的用户,并将其添加到其中。
查询每个 View 。如果状态是您所需要的,请将用户名添加到您的集合中。当所有查询都完成后,您就有了完整的答案。
哦不!但这太慢了! 事实上,很多时候,解决方案在“理论上”是缓慢的,但实际上它们对于需求来说已经足够快了。你有一个 Rails 服务器。它可能具有对 CouchDB 的高速、低延迟 (LAN) 访问。 CouchDB 中的每个查询始终是一次高效的索引扫描。所以你提出了 3 个请求,砰,砰,砰!客户端通过低速、高延迟的连接(互联网)查询 Rails,它可能不会注意到。
或者,根据您的语言和技能,您可以同时(异步)执行这些查询,并且查询时间基本上会很快。
解决方案2: secret 多 key 查询
CouchDB 实际上支持对 View 的一些“OR”查询。有关详细信息,请参阅 CouchDB view options。
您需要一个 View 来存储所有信息。我建议使用数组键
[status, key_type, key_value]
。例如,如果您有两个用户 Alice 和 Bob,则查看 key 将为:["reading" , "email" , "alice@alice.com"]
["reading" , "username", "alice"]
["sleeping", "email" , "bob@bob.com"]
["sleeping", "username", "bob"]
您将如何查询
status = "sleeping" and username = "X" or email = "Y"
?这变成了对 View 的多个查询,每个查询都有一个不同的键:
key=["sleeping", "username", "X"]
key=["sleeping", "email" , "Y']
幸运的是,您可以同时查询多个键。
POST /db/_design/example/_view/state_and_identifiers
Content-Type: application/json
{"keys": [ ["sleeping", "username", "X"]
, ["sleeping", "email" , "Y']
]
}
CouchDB 将在一个响应中返回所有结果。
概括
第二种解决方案非常强大,但是您必须做很多工作才能获得正确的查询。而且这种技术不能总是满足任何 SQL 查询。 SQL 在询问您能想到的任何问题时更强大。对于 CouchDB,您始终必须先教它做什么。那很不方便。但结果是,保证查询速度很快。
考虑到方案二的不便,我个人更喜欢方案一,能不能在CouchDB中做一个“join”?当然!联接是如此简单。只需进行多次查询,直到获得所需数据。如果您的应用程序需要非常频繁地“加入”,并且使用 CouchDB 既困难又容易出错怎么办?这是一个强有力的迹象,表明 CouchDB 可能不适合您的应用程序。
关于ruby-on-rails - 如何在 couchdb View 中使用 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7110340/