加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在couchdb视图中使用OR

发布时间:2020-12-17 04:04:15 所属栏目:百科 来源:网络整理
导读:我在rails和couchdb上使用 ruby,但我在couchdb中有问题视图 在我想要的SQL: select * from user where username = … or email = … and status = … 我该如何创建这样的视图? 解决方法 该查询是您的数据的连接. (不,这不是一个真正的JOIN声明,但我的意思
我在rails和couchdb上使用 ruby,但我在couchdb中有问题视图

在我想要的SQL:

select * from user where username = … or email = … and status = …

我该如何创建这样的视图?

解决方法

该查询是您的数据的连接. (不,这不是一个真正的JOIN声明,但我的意思是,你要问3个不同的问题并在答案中“加入”结果.)

解决方案1:只需多次查询.

假设你创建了2个视图,值是状态,键是这样的:

> by_username
> by_email

保留地图(Java),或dict(Python),哈希(Perl),对象(Javascript)或任何您的键/值数据结构.您希望保留一组匹配的用户,并添加到该用户.

查询每个视图.如果状态是您所需要的,请将用户名添加到您的集合中.完成所有查询后,您将获得完整的答案.

不好了!但那太慢了!实际上,通常情况下,解决方案“理论上”很慢,但实际上它们对于要求来说速度很快.你有一个Rails服务器.它可能具有对CouchDB的高速,低延迟(LAN)访问. CouchDB中的每个查询始终是一个有效的索引扫描.所以你提出3个请求,bam,bam!客户端通过低速,高延迟的连接(Internet)查询Rails,它可能不会注意到.

或者,根据您的语言和技能,您可以同时(异步)执行这些查询,并且查询时间基本上会很快.

解决方案2:秘密多键查询

CouchDB实际上支持对视图的一些“OR”查询.有关详细信息,请参阅CouchDB view options.

您需要一个视图来存储所有信息.我建议使用数组键,[status,key_type,key_value].例如,如果您有两个用户,Alice和Bob,则视图键将是:

["reading","email","alice@alice.com"]
["reading","username","alice"]
["sleeping","bob@bob.com"]
["sleeping","bob"]

您如何查询status =“sleeping”和username =“X”或email =“Y”?

这将成为视图的多个查询,每个查询都有不同的键:

key=["sleeping","X"]
key=["sleeping","Y']

幸运的是,您可以同时查询多个密钥.

POST /db/_design/example/_view/state_and_identifiers
Content-Type: application/json

{"keys": [ ["sleeping","X"],["sleeping","Y']
         ]
}

CouchDB将在一个响应中返回所有结果.

摘要

第二种解决方案非常强大,但是您必须做很多工作才能获得正确的查询.并且这种技术不能总是满足任何SQL查询. SQL可以更好地提出您可以想到的任何问题.对于CouchDB,您总是必须先教它做什么.这很不方便.但结果是,查询保证很快.

考虑到解决方案2的不便,我个人更喜欢解决方案1.你能在CouchDB中“加入”吗?当然!联接非常简单.只需进行多次查询,直到获得所需的数据.如果您的应用程序需要经常“加入”,并且使用CouchDB很困难且有问题,该怎么办?这是一个强有力的信号,表明CouchDB可能不适合您的应用程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读