MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

L'index MongoDB insensible à la casse commence avec des problèmes de performances

Edit:il existe une solution de contournement réalisable. Fondamentalement, si le mot que vous recherchez est "bob", vous pouvez rechercher $lt:"boc", (où vous incrémentez le dernier caractère d'un), et $gte "bob". Cela utilisera l'index. Vous pouvez utiliser la fonction suivante que j'ai créée ci-dessous (attention, ce n'est pas nécessairement sans bogue mais fonctionne à peu près) comme ceci :

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

Eh bien, il s'avère que MongoDB ne le supporte officiellement pas ! J'ai lié à un problème dans JIRA où ils le précisent. Cela rend les classements beaucoup moins utiles, malheureusement. Faisons appel à eux pour résoudre ce problème rapidement ! Techniquement parlant, j'ai remarqué que même s'il utilise l'index, l'index utilise "[\"\", {})", comme l'une de ses limites d'index, qui renvoie toujours tous les éléments de l'index, de sorte que le parcours de l'index est inutile. L'étape suivante de la requête filtre ces résultats comme d'habitude.

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

Votez pour ce problème pour qu'ils le corrigent !https://jira.mongodb.org/ parcourir/SERVER-29865