[英]Why doesn't this Cloudant/couchdb $regex query work?
我試圖從我們的數據庫中拉(刪除)所有沒有 URL並帶有單詞“ box”的記錄。 這是我正在使用的查詢:
{
"selector": {
"$not": {
"url": {
"$regex": ".*box.*"
}
}
},
"limit": 50
}
該查詢不返回任何記錄。 但是,如果刪除$ not,我將在URL中獲得所有確實帶有單詞“ box”的記錄,但這與我想要的相反。 為什么在添加$ not時沒有結果?
我曾嘗試向查詢添加一個簡單的基礎,例如“ _id”:{“ $ gte”:0},但這無濟於事。
來自Cloudant doc :
您可以通過組合運算符來創建更復雜的選擇器表達式。 但是,對於json類型的Cloudant NoSQL DB查詢索引,您不能使用“組合”或“數組邏輯”運算符(例如$ regex)作為查詢的基礎。
$not
是組合運算符 ,因此不能作為查詢的基礎
我能夠使以下工作:
指數
{
"index": {
"fields": ["url"]
},
"name" : "url-json-index",
"type" : "json"
}
詢問
{
"selector": {
"url": {
"$not": {
"$regex": ".*box.*"
}
}
},
"limit": 50,
"use_index": "url-json-index"
}
如果仍然遇到問題,可以提供_/explain
的輸出以及已建立的索引。
“無結果”問題是由於最近已修復的文本索引錯誤所致。 但是, $not
和$regex
運算符都不能利用全局索引,因此將始終導致完整的數據庫或索引掃描。
優化此查詢的方法是使用部分索引 。 部分索引在建立索引時而不是在查詢時過濾文檔,從而在數據庫的子集上創建索引。 然后,您需要告訴_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中查看掃描了多少文檔以完成查詢-執行統計信息顯示在查詢文本區域下方的彈出窗口中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.