フィールドが値で始まるドキュメントを探しています。
notablescan を使用して、テーブルスキャンを無効にします。
これは動作します:
db.articles.find({"url" : { $regex : /^http/ }})
これはしません:
db.articles.find({"source.homeUrl" : { $regex : /^http/ }})
エラーが表示されます:
error: { "$err" : "table scans not allowed:moreover.articles", "code" : 10111 }
url
とsource.homeUrl
の両方にインデックスがあります:
{
"v" : 1,
"key" : {
"url" : 1
},
"ns" : "mydb.articles",
"name" : "url_1"
}
{
"v" : 1,
"key" : {
"source.homeUrl" : 1
},
"ns" : "mydb.articles",
"name" : "source.homeUrl_1",
"background" : true
}
サブドキュメントインデックスの正規表現クエリに制限はありますか?
テーブルスキャンを無効にすると、クエリオプティマイザーでテーブルスキャンが「勝った」クエリは実行できなくなります。あなたは説明を投稿していませんが、それがエラーに基づいてここで起こっていることであると仮定することは合理的です。インデックスに明示的にヒントを付けてみてください。
db.articles.find({"source.homeUrl" : { $regex : /^http/ }}).hint({"source.homeUrl" : 1})
これにより、可能な選択肢としてのテーブルスキャンが排除され、クエリが正常に返されるようになります。