sql >> Base de Datos >  >> NoSQL >> MongoDB

El índice insensible a mayúsculas y minúsculas de MongoDB comienza con problemas de rendimiento

Editar:hay una solución viable. Básicamente, si la palabra que está buscando es "bob", puede buscar $lt:"boc", (donde incrementa el último carácter en uno) y $gte "bob". Esto utilizará el índice. Puede usar la siguiente función que hice a continuación (advertencia, no necesariamente está libre de errores, pero funciona bastante bien) así:

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

¡Bueno, resulta que MongoDB oficialmente no lo admite! He vinculado a un problema en JIRA donde dejan esto claro. Desafortunadamente, esto hace que las intercalaciones sean significativamente menos útiles. ¡Vamos a solucionarlo pronto! Hablando técnicamente, noté que aunque está usando el índice, el índice usa "[\"\", {})", como uno de sus límites de índice, que siempre devuelve todos los elementos del índice, por lo que el escaneo del índice es inútil. La siguiente etapa de la consulta filtra esos resultados como de costumbre.

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

¡Vota por este problema para que lo solucionen!https://jira.mongodb.org/ navegar/SERVIDOR-29865