MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Index ohne Berücksichtigung der Groß-/Kleinschreibung beginnt mit Leistungsproblemen

Bearbeiten:Es gibt eine praktikable Problemumgehung. Wenn das Wort, nach dem Sie suchen, "bob" ist, können Sie grundsätzlich nach $lt:"boc" (wobei Sie das letzte Zeichen um eins erhöhen) und $gte "bob" suchen. Dies wird den Index verwenden. Sie können die folgende Funktion, die ich unten erstellt habe (Achtung, sie ist nicht unbedingt fehlerfrei, funktioniert aber ziemlich genau), wie folgt verwenden:

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

Nun, es stellt sich heraus, dass MongoDB es offiziell nicht unterstützt! Ich habe auf ein Problem in JIRA verlinkt, wo sie dies deutlich machen. Dies macht Sortierungen leider deutlich weniger nützlich. Lassen Sie uns das bald beheben! Technisch gesehen ist mir aufgefallen, dass der Index "[\"\", {})", verwendet, obwohl er den Index verwendet als eine seiner Indexgrenzen, die immer alle Elemente im Index zurückgibt, sodass der Index-Scan nutzlos ist. Die nächste Stufe der Abfrage filtert diese Ergebnisse wie gewohnt.

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

Stimmen Sie für dieses Problem ab, damit sie es beheben!https://jira.mongodb.org/ durchsuchen/SERVER-29865