sql >> Databáze >  >> NoSQL >> MongoDB

Index MongoDB bez ohledu na velikost písmen začíná problémy s výkonem

Edit:existuje funkční řešení. V zásadě, pokud je slovo, které hledáte, "bob", můžete hledat $lt:"boc", (kde zvětšíte poslední znak o jeden) a $gte "bob". Tím se použije index. Můžete použít následující funkci, kterou jsem vytvořil níže (upozorňujem, že nemusí být bez chyb, ale v podstatě funguje) takto:

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

No, ukázalo se, že MongoDB to oficiálně nepodporuje! Odkazoval jsem na problém v JIRA, kde je to jasné. Díky tomu jsou kolace výrazně méně užitečné, bohužel. Pojďme na ně, aby to brzy napravili! Technicky vzato, všiml jsem si, že i když používá index, index používá "[\"\", {})", jako jedna z jeho hranic indexu, která vždy vrací všechny položky v indexu, je tedy prohledávání indexu zbytečné. Další fáze dotazu filtruje tyto výsledky jako obvykle.

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

Hlasujte pro tento problém, aby jej vyřešili!https://jira.mongodb.org/ procházet/SERVER-29865




  1. Node.js Kue, jak restartovat neúspěšné úlohy

  2. transakce více dokumentů nefunguje v c# pomocí komunitního serveru mongodb 4.08

  3. node.js moongodb dva nálezy

  4. Předávání dat MongoDB do .ejs pomocí node.js