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

MongoDB case-ufølsomt indeks starter med ydeevneproblemer

Edit:der er en brugbar løsning. Grundlæggende hvis ordet du søger efter er "bob", kan du søge efter $lt:"boc", (hvor du øger det sidste tegn med et), og $gte "bob". Dette vil bruge indekset. Du kan bruge følgende funktion, jeg lavede nedenfor (advarsel, den er ikke nødvendigvis fejlfri, men fungerer stort set) sådan her:

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

Det viser sig, at MongoDB officielt ikke understøtter det! Jeg har linket til et problem i JIRA, hvor de gør dette klart. Dette gør sammenstillinger væsentligt mindre nyttige, desværre. Lad os få dem til at ordne dette snart! Teknisk set bemærkede jeg, at selvom det bruger indekset, bruger indekset "[\"\", {})", som en af ​​dets indeksgrænser, som altid returnerer alle elementer i indekset, så indeksscanningen er ubrugelig. Den næste fase af forespørgslen filtrerer gennem disse resultater som normalt.

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

Stem på dette problem for at få dem til at løse det!https://jira.mongodb.org/ browse/SERVER-29865




  1. MongoDB / Morphia gemmer teknisk id som ObjectId, selvom det er en streng i Java

  2. Adgang til MongoDB fra Go

  3. Få besked om ændrede dokumenter i mongodb

  4. MongoDB forEach()