繁体   English   中英

CouchDB情况下的敏感和OR选项,如在mysql中

[英]CouchDB case in-sensitive and OR options like in mysql

我对couchDB很新,我需要一些支持。

在MySQL中我可以简单地运行这个查询:

SELECT `name`, `id`, `desc` FROM `table` 
WHERE `name`="jack" OR `cat` LIKE "%|52224|%";

这是我的两个问题:

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

function(doc) {
    emit([doc.name, doc.cat], {
"name" : doc.name,
"desc" : doc.desc,
"id" : doc._id
});
}

1.当我使用“emit([doc.name”时,字符串必须匹配100%(也区分大小写)。
- >我如何使这个选项案例不敏感?
我可以在mysql中询问("Jack, jack, jAck, JAck,...)

2.我如何创建OR选项?

当我使用[doc.name, doc.cat] ,我也被迫要求两个变量。
但是当我只有其中一个,
如何在不为每个选项创建自己的视图的情况下进行查询?

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

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

现在,如果将查询转换为小写,则会出现不区分大小写的匹配。 此解决方案的问题是,如果您想要区分大小写和不区分大小写的搜索,您可以发出两个值:
[doc.name.toLowerCase(), doc.name, doc.cat]
并使用startkey和endkey来过滤结果,或创建单独的视图。


第二个问题实施起来有点棘手。
首先,如果你需要按doc.name过滤,你可以发送带有startkey=["jack",0]endkey=["jack",'zzzzzz'] ,它将返回所有带有doc.name="jack"文件doc.name="jack"doc.cat介于0'zzzzzz' (可能有更好的方式来说“任何猫”,不幸的是我现在找不到它)。
如果你需要一个真正的OR,那么你应该为每个文档发出两行:
emit(doc.name, doc); emit(doc.cat, doc);

通过这种方式,您可以根据您的请求发布所需的密钥: {"keys": ["jack", "cat_name"]}
这将使用"jack""cat_name"键返回每个文档。 但是,具有两者的文档将被返回两次,因此您必须在应用程序代码中过滤重复项。


你也可以使用couchdb-lucene来解决你的两个问题,可能还会解决很多问题。 它是couchdb用户中用于实现高级查询的流行选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM