MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Indeks MongoDB nieuwzględniający wielkości liter zaczyna się od problemów z wydajnością

Edycja:istnieje wykonalne obejście. Zasadniczo, jeśli szukane słowo to "bob", możesz wyszukać $lt:"boc" (gdzie zwiększasz ostatni znak o jeden) i $gte "bob". Użyje to indeksu. Możesz użyć następującej funkcji, którą stworzyłem poniżej (ostrzegając, że niekoniecznie jest wolna od błędów, ale prawie działa) w ten sposób:

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

Okazuje się, że MongoDB oficjalnie tego nie obsługuje! Połączyłem się z problemem w JIRA, w którym jest to jasne. To sprawia, że ​​zestawienia są znacznie mniej przydatne, niestety. Zajmijmy się nimi, aby to naprawić wkrótce! Technicznie rzecz biorąc, zauważyłem, że chociaż używa indeksu, indeks używa "[\"\", {})", jako jedna z granic indeksu, która zawsze zwraca wszystkie elementy w indeksie, więc skanowanie indeksu jest bezużyteczne. Następny etap zapytania filtruje te wyniki jak zwykle.

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

Zagłosuj na ten problem, aby go naprawić!https://jira.mongodb.org/ przeglądaj/SERWER-29865




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mangusta .save() nie działa

  2. Gdzie jest baza danych meteor MongoDB?

  3. Mongoose tworzy połączenie dla obsługi wielu dzierżawców w node.js

  4. Jak prawidłowo iterować przez duży plik json

  5. MongoDb:znajdź głęboko zagnieżdżony obiekt za pomocą $lookup