为什么Cloudant / couchdb $ regex查询不起作用?

时间:2018-01-26 20:32:26

标签: ibm-cloud cloudant

我试图从我们的数据库中提取(并删除)所有的网址,其中包含“' box'在里面。这是我使用的查询:

{
   "selector": {
      "$not": {
         "url": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50
}

此查询不返回任何记录。但是,如果我删除$ not,我会得到的所有记录都有' box'在网址中,但这与我想要的相反。添加$ not时为什么没有结果?

我尝试在查询中添加一个简单的基础,例如" _id":{" $ gte":0}但这并没有帮助。

2 个答案:

答案 0 :(得分:0)

来自Cloudant doc

  

您可以通过组合创建更复杂的选择器表达式   运营商。但是,对于类型为json的Cloudant NoSQL DB Query索引,   你不能使用'组合'或者'数组逻辑'运营商如   $ regex作为查询的基础。

$notcombination operator,因此不能作为查询的基础

我可以让以下工作:

<强>索引

{
    "index": {
        "fields": ["url"]
    },
    "name" : "url-json-index",
    "type" : "json"
}

<强>查询

{
   "selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50,
   "use_index": "url-json-index"
}

如果您仍然遇到问题,可以提供_/explain的输出和您已有的索引。

答案 1 :(得分:0)

&#34;没有结果&#34;问题是由于最近修复的文本索引中的错误。但是,$not$regex运算符都不能利用全局索引,因此总是会导致完整的数据库或索引扫描。

优化此查询的方法是使用partial index。部分索引在索引时而不是在查询时过滤文档,从而在数据库的子集上创建索引。然后,您需要告诉_find端点明确使用部分索引。例如,创建一个仅包含与正则表达式不匹配的文档的索引:

POST /<db>/_index
{
  "index": {
    "partial_filter_selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
    },
    "fields": ["type"]
  },
  "ddoc" : "url-not-box",
  "type" : "json"
}

然后在查询时间:

{
   "selector": {
      "url": {
         "$not": {
            "$regex": ".*box.*"
         }
      }
   },
   "limit": 50,
   "use_index": "url-not-box"
}

您可以查看在Cloudant UI中扫描了多少文档以完成查询 - 执行统计信息显示在查询文本区域下方的弹出窗口中。

您可能还会发现有关部分索引有用的This article