sql >> データベース >  >> NoSQL >> MongoDB

MongoDBの大文字と小文字を区別しないインデックスは、パフォーマンスの問題から始まります

    編集:実行可能な回避策があります。基本的に、検索する単語が「bob」の場合、$ lt: "boc"(最後の文字を1つ増やす)、および$gte"bob"を検索できます。これはインデックスを使用します。以下で作成した次の関数を使用できます(必ずしもバグがないわけではありませんが、ほとんど機能します)。

    var searchCriteria = {};
    addStartsWithQuery(searchCriteria, "firstName", "bo");
    People.find(searchCriteria).then(...);
    
    //searchCriteria will be
    /*
    {
        $and:[
             {firstName:{$gte:"bo"}},
             {firstName:{$lt:"bp"}}
        ]
    }
    */
    
    
    //now library functions that will automatically generate the correct query and add it to `searchCriteria`.  Of course for complicated queries you may have to modifiy it a bit.
    function getEndStr(str) {
        var endStrArr = str.toLocaleLowerCase('en-US').split("");
        for (var i = endStrArr.length - 1; i >= 0; --i) {
            var lastChar = endStrArr[i];
            if(lastChar === "z"){
                return endStrArr.join("") + "zzzzzzzzzzzz";
            }
            var nextChar = String.fromCharCode(lastChar.charCodeAt(0) + 1);
            if (nextChar === ":")
                nextChar = "a";
            if (nextChar !== false) {
                endStrArr[i] = nextChar;
                return endStrArr.join("");
            }
            endStrArr.pop();
        }
    }
    function addStartsWithQuery(searchCriteria, propertyName, str) {
        if (!(typeof str === 'string') || !str.length)
            return;
        var endStr = getEndStr(str);
        if (endStr) {
            if (!searchCriteria.$and)
                searchCriteria.$and = [];
            searchCriteria.$and.push({
                [propertyName]: {
                    $gte: str
                }
            });
            searchCriteria.$and.push({
                [propertyName]: {
                    $lt: endStr
                }
            });
        } else {
            searchCriteria[propertyName] = {
                $gte: str
            }
        }
    }
    

    さて、MongoDBは公式にはそれをサポートしていないことがわかりました!これを明確にするJIRAの問題にリンクしました。残念ながら、これにより照合の有用性が大幅に低下します。すぐにこれを修正するためにそれらに乗りましょう!技術的には、インデックスを使用しているにもかかわらず、インデックスが"[\"\", {})",を使用していることに気付きました。 インデックス境界の1つとして、常にインデックス内のすべてのアイテムを返すため、インデックススキャンは役に立ちません。クエリの次の段階では、通常のようにこれらの結果をフィルタリングします。

    https://jira.mongodb.org/browse/DOCS-9933

    この問題に投票して修正してもらいます! https://jira.mongodb.org/参照/SERVER-29865




    1. mgoでタイプマッピングを実施する

    2. Javaからmongodbに接続したときにコンソールにログオンしないようにするにはどうすればよいですか?

    3. Mongodb$whereクエリはnodejsで常にtrue

    4. MongoDBクエリで$regexの値としてjavascript変数を使用します