MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

L'indice MongoDB senza distinzione tra maiuscole e minuscole inizia con problemi di prestazioni

Modifica:esiste una soluzione praticabile. Fondamentalmente se la parola che stai cercando è "bob", puoi cercare $lt:"boc", (dove incrementi l'ultimo carattere di uno) e $gte "bob". Questo utilizzerà l'indice. Puoi usare la seguente funzione che ho creato di seguito (attenzione non è necessariamente priva di bug ma funziona praticamente) in questo modo:

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

Bene, si scopre che MongoDB ufficialmente non lo supporta! Ho collegato un problema in JIRA in cui lo chiariscono. Questo rende le regole di confronto significativamente meno utili, sfortunatamente. Diamoci da fare per risolvere questo problema presto! Tecnicamente ho notato che anche se sta usando l'indice, l'indice usa "[\"\", {})", come uno dei suoi limiti di indice, che restituisce sempre tutti gli elementi nell'indice, quindi la scansione dell'indice è inutile. La fase successiva della query filtra i risultati come di consueto.

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

Vota questo problema per convincerli a risolverlo!https://jira.mongodb.org/ sfoglia/SERVER-29865