我有一个包含以下数据结构的文档数据库:
{
"_id": "sampleID",
"_rev": "sample-rev",
"added": "2014-09-09 01:05:32",
"cached": 1,
"subject": "sample topic",
"mode": "<samplemode>",
"protected": 0,
"added_by": "myname",
"factoid": "sample factoid"
}
我有以下观点:
function(doc) {
if (doc.subject && doc.factoid && doc.mode){
emit(doc.subject, doc.factoid);
}
}
我需要检索“主题”与提供的密钥匹配的所有文档。我希望它不区分大小写。 POST将为我提供我想要的所有匹配项,但仅限于案例匹配。
https://<username>.cloudant.com/<db>/_design/<designdoc>/_view/<view>?include_docs=true
{ "keys" : ["<subject>"] }
我也试过搜索索引但没有成功。这个API提到了一个我无法工作的正则表达式运算符。这看起来很简单,我应该怎样接近这个?
关于$ regex方法,这就是我所处的位置。以下POST的工作方式与我以前尝试返回区分大小写的结果非常相似。
https://<username>.cloudant.com/<db>/_find
{
"selector": {
"subject": {"$eq": "<subject>"}
},
"fields": ["_id", "_rev", "subject", "factoid"]
}
用$ regex运算符替换$ eq会产生以下错误:
{
"error": "no_usable_index",
"reason": "There is no operator in this selector can used with an index."
}
此功能的参考材料相当纤薄。仅在此页面上提及:https://docs.cloudant.com/api/cloudant-query.html
答案 0 :(得分:3)
我认为使用Cloudant Query $ regex运算符是可行的方法。
您在加入该错误时收到该错误的原因是因为您无法使用$ regex作为选择器表达式的基础。以下是其文档中的相关位(https://docs.cloudant.com/api.html#condition-operators):
但是,并非所有运算符都可以用作选择器表达式的基础或起点。
您不能使用组合或数组逻辑运算符(例如$ regex)作为查询的基础。
相反,你可以这样做:
https://<username>.cloudant.com/<db>/_find
{
"selector": {
"_id": {
"$gt": null
},
"subject": {"$regex": "<subject>"}
},
"fields": ["_id", "_rev", "subject", "factoid"]
}
这应该会为您提供您正在寻找的结果,但是,文档会继续说明以下内容,因此请注意大型数据库:
此表达式始终为true,从而可以应用选择器表达式的其余部分。
使用{“_ id”:{“$ gt”:null}}会导致全表扫描,对大型数据库效率不高。
答案 1 :(得分:0)
一个选项是创建一个存储大写搜索字符串的二级索引:
function(doc) {
if (doc.subject){
emit(doc.subject.toUpperCase());
}
}
然后,应用程序可以在将搜索条件发送到数据库之前将其大写:
https://username.cloudant.com/database/_design/designdoc/_view/view?key=“SAMPLE TOPIC"&include_docs=true
会导致这个:
{
"offset": 0,
"rows": [
{
"doc": {
"_id": "sampleID",
"_rev": "1-d77a468b74497771f8d37130a7cf02eb",
"added": "2014-09-09 01:05:32",
"added_by": "myname",
"cached": 1,
"factoid": "sample factoid",
"mode": "<samplemode>",
"protected": 0,
"subject": "sample topic"
},
"id": "sampleID",
"key": "SAMPLE TOPIC",
"value": null
}
],
"total_rows": 1
}