首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CouchDB大小写敏感和OR选项,如mysql中的

CouchDB大小写敏感和OR选项,如mysql中的
EN

Stack Overflow用户
提问于 2010-12-06 14:33:45
回答 1查看 3.4K关注 0票数 6

我对couchDB非常陌生,我需要一些支持。

在MySQL中,我可以简单地运行以下查询:

代码语言:javascript
复制
SELECT `name`, `id`, `desc` FROM `table` 
WHERE `name`="jack" OR `cat` LIKE "%|52224|%";

以下是我的两个问题:

我开始创建一个视图(仍然没有Like选项和所有内容):

代码语言:javascript
复制
function(doc) {
    emit([doc.name, doc.cat], {
"name" : doc.name,
"desc" : doc.desc,
"id" : doc._id
});
}

当我使用“([doc.name”)时,字符串必须100%匹配(也区分大小写).

->,我是如何使这个选项成为非实战的?

我可以像mysql那样要求("Jack, jack, jAck, JAck,...)吗?

2.如何创建OR选项?

当我使用[doc.name, doc.cat]时,我还被迫要求两个vars。

但当我只有一个的时候,

如何在不为每个选项创建自己的视图的情况下进行查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-06 15:17:22

要实现不区分大小写的搜索,只需将键转换为小写:

emit([doc.name.toLowerCase(), doc.cat.toLowerCase()])

现在,如果将查询转换为小写,则将进行不区分大小写的匹配。此解决方案的问题是,如果希望同时区分大小写和不区分大小写,则可以同时发出两个值:

[doc.name.toLowerCase(), doc.name, doc.cat]

并使用startkey和endkey筛选结果,或创建单独的视图。

第二个问题更难实现。

首先,如果您只需要使用doc.name进行筛选,那么您可以使用startkey=["jack",0]endkey=["jack",'zzzzzz']发送请求,这将返回0'zzzzzz'之间所有带有doc.name="jack"doc.cat的文档(很遗憾,我现在找不到更好的方法来表示“任何猫”)。

如果您需要一个真实的或,那么您应该为每个文档发出两行:

emit(doc.name, doc); emit(doc.cat, doc);

通过这种方式,您可以在请求中发布所需的密钥:{"keys": ["jack", "cat_name"]}

这将用"jack""cat_name"键返回每个文档。但是,两次都有的文档将被返回两次,因此您必须在应用程序代码中筛选重复的文档。

您还可以使用库切德-卢塞尼,这将解决您的两个问题,并且可能会解决更多问题。在couchdb用户中,它是实现高级查询的一个流行选择。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4367431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档