我试图从我们的数据库中提取(并删除)所有不的网址,其中包含“' box'在里面。这是我使用的查询:
{
"selector": {
"$not": {
"url": {
"$regex": ".*box.*"
}
}
},
"limit": 50
}
此查询不返回任何记录。但是,如果我删除$ not,我会得到做的所有记录都有' box'在网址中,但这与我想要的相反。添加$ not时为什么没有结果?
我尝试在查询中添加一个简单的基础,例如" _id":{" $ gte":0}但这并没有帮助。
答案 0 :(得分:0)
来自Cloudant doc:
您可以通过组合创建更复杂的选择器表达式 运营商。但是,对于类型为json的Cloudant NoSQL DB Query索引, 你不能使用'组合'或者'数组逻辑'运营商如 $ regex作为查询的基础。
$not
是combination 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。