ruby-on-rails - 如何在 couchdb View 中使用 OR

标签 ruby-on-rails couchdb

我在 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/

    相关文章:

    ruby-on-rails - Ruby On Rails、Postgresql - 每分钟组的 Date_Part 或 Extract

    nosql - 在 CouchDB View 中排序日期

    couchdb - CouchDB 中的多键搜索

    couchdb - 在twisted中实现重新连接http客户端

    couchdb - Node.js Koa 应用程序和 CouchDB 在单个容器中

    ruby-on-rails - 无法使用 Assets :precompile 在 rails rake 上复制 NilClass

    ruby-on-rails - 如何使用 JBuilder 从数组中完全删除一个空元素

    ruby-on-rails - 最佳实践,为 gemfile 中的每个 gem 添加一个版本?

    java - 使用修订 ID 检索 CouchDB 文档的先前修订?

    ruby-on-rails - Ruby on Rails——静态页面的独立 Controller 方法