MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Индексът MongoDB, който не е чувствителен към главни и малки букви, започва с проблеми с производителността

Редактиране:има работещо решение. По принцип, ако думата, която търсите, е "bob", можете да търсите $lt:"boc", (където увеличавате последния знак с единица) и $gte "bob". Това ще използва индекса. Можете да използвате следната функция, която направих по-долу (предупреждавам, че не е задължително да съдържа грешки, но почти работи) по този начин:

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

Е, оказва се, че MongoDB официално не го поддържа! Свързах се с проблем в JIRA, където те изясняват това. Това за съжаление прави сравнението значително по-малко полезно. Нека ги накараме да поправят това скоро! Технически погледнато, забелязах, че въпреки че използва индекса, индексът използва "[\"\", {})", като една от неговите граници на индекса, която винаги връща всички елементи в индекса, така че сканирането на индекса е безполезно. Следващият етап от заявката филтрира тези резултати като обикновено.

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

Гласувайте за този проблем, за да ги накарате да го поправят!https://jira.mongodb.org/ browse/SERVER-29865




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Spring Data Mongo - Как да картографирате наследени POJO обекти?

  2. Как да добавя резултатите от агрегацията на Mongo DB към съществуваща колекция?

  3. Mongodb - $group в $group (по 'ключ')

  4. Съществува обобщение на MongoDB по поле

  5. Как мога да изчисля обща положителна, обща отрицателна цена и сума с помощта на Node.js и Mongoose