web-dev-qa-db-ja.com

インデックス付きサブドキュメントフィールドでMongoDBの「次で始まる」クエリを実行できますか?

フィールドが値で始まるドキュメントを探しています。

notablescan を使用して、テーブルスキャンを無効にします。

これは動作します:

db.articles.find({"url" : { $regex : /^http/ }})

これはしません:

db.articles.find({"source.homeUrl" : { $regex : /^http/ }})

エラーが表示されます:

error: { "$err" : "table scans not allowed:moreover.articles", "code" : 10111 }

urlsource.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
}

サブドキュメントインデックスの正規表現クエリに制限はありますか?

27
Tom Robinson

テーブルスキャンを無効にすると、クエリオプティマイザーでテーブルスキャンが「勝った」クエリは実行できなくなります。あなたは説明を投稿していませんが、それがエラーに基づいてここで起こっていることであると仮定することは合理的です。インデックスに明示的にヒントを付けてみてください。

db.articles.find({"source.homeUrl" : { $regex : /^http/ }}).hint({"source.homeUrl" : 1})

これにより、可能な選択肢としてのテーブルスキャンが排除され、クエリが正常に返されるようになります。

33
Adam Comerford