1

mongo で複数の開始文字列を一致させたい。Explain() は、このクエリに indexedfield インデックスを使用していることを示しています。

db.mycol.find({indexedfield:/^startstring/,nonindexedfield:/somesubstring/});

ただし、複数の開始文字列に対する次のクエリは非常に低速です。Explain を実行すると、エラーが発生します。mongostat (毎秒 7k) で確認できる障害から判断すると、コレクション全体をスキャンしています。また、数秒ごとに 0% のロックと 90 ~ 95% のロックが交互に繰り返されます。

db.mycol.find({indexedfield:/^(startstring1|startstring2)/,nonindexedfield:/somesubstring/}).explain();

JavaScript execution failed: error: { "$err" : "assertion src/mongo/db/key.cpp:421" } at src/mongo/shell/query.js:L128

これを行う方法や説明エラーの原因について、誰かが光を当てることができますか?

更新 - 詳細情報

わかりましたので、結果の数を制限することで、Explain をより複雑なクエリで動作させることができました。違いは次のとおりです。

単一の部分文字列の場合、「^/BA1/」(はい、郵便番号です)

"cursor" : "BtreeCursor pc_1 multi",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 10,
"nscanned" : 10,
"nscannedObjectsAllPlans" : 19,
"nscannedAllPlans" : 19,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
    "indexedfield" : [
        [
            "BA1",
            "BA2"
        ],
        [
            /^BA1/,
            /^BA1/
        ]
    ]
}

複数の部分文字列の場合 "^(BA1|BA2)/"

"cursor" : "BtreeCursor pc_1 multi",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 10,
"nscanned" : 1075276,
"nscannedObjectsAllPlans" : 1075285,
"nscannedAllPlans" : 2150551,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 5,
"nChunkSkips" : 0,
"millis" : 4596,
"indexBounds" : {
    "indexedfield" : [
        [
            "",
            {

            }
        ],
        [
            /^(BA1|BA2)/,
            /^(BA1|BA2)/
        ]
    ]
}

これはあまり良くありません。

4

1 に答える 1