Javascript 敏感和/或选项中的CouchDB大小写,如mysql中的

Javascript 敏感和/或选项中的CouchDB大小写,如mysql中的,javascript,mysql,couchdb,Javascript,Mysql,Couchdb,我是couchDB的新手,需要一些支持 在MySQL中,我可以简单地运行以下查询: SELECT `name`, `id`, `desc` FROM `table` WHERE `name`="jack" OR `cat` LIKE "%|52224|%"; 以下是我的两个问题: 我开始创建一个视图(仍然没有Like选项和所有选项): 1。当我使用“emit([doc.name”)时,字符串必须匹配100%(也区分大小写)。 ->如何使此选项案例不敏感? 我可以像mysql那样要求(“杰克,

我是couchDB的新手,需要一些支持

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

SELECT `name`, `id`, `desc` FROM `table` 
WHERE `name`="jack" OR `cat` LIKE "%|52224|%";
以下是我的两个问题:

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

1。当我使用“emit([doc.name”)时,字符串必须匹配100%(也区分大小写)。
->如何使此选项案例不敏感?
我可以像mysql那样要求
(“杰克,杰克,杰克,杰克,…)

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.cat
介于
0
'zzzzzzzzzz'
之间的所有文档(可能有更好的说法是“任何cat”)“,很遗憾,我现在找不到它)。
如果需要实际OR,则应为每个文档发出两行:
emit(doc.name,doc);emit(doc.cat,doc);

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

这将返回每个带有
“jack”
“cat_name”
键的文档。但是,同时具有这两个键的文档将返回两次,因此您必须过滤应用程序代码中的重复项



您也可以使用它来解决这两个问题,甚至可能解决更多问题。这是couchdb用户实现高级查询的常用选择。

非常感谢,因此您会建议我创建两个视图并查询两次或发出两次?谢谢!对于区分大小写和不区分大小写的搜索,两个视图将使应用程序逻辑更简单。但是对于OR查询,您应该发出2次,因为这样您只需要进行一次查询,而不是两次,并且在任何情况下都必须过滤重复的查询。
function(doc) {
    emit([doc.name, doc.cat], {
"name" : doc.name,
"desc" : doc.desc,
"id" : doc._id
});
}