MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Indeks tidak sensitif huruf MongoDB dimulai dengan masalah kinerja

Sunting:ada solusi yang bisa diterapkan. Pada dasarnya jika kata yang Anda cari adalah "bob", Anda dapat mencari $lt:"boc", (di mana Anda menambah satu karakter terakhir), dan $gte "bob". Ini akan menggunakan index. Anda dapat menggunakan fungsi berikut yang saya buat di bawah ini (peringatan tidak harus bebas bug tetapi cukup banyak berfungsi) seperti ini:

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

Nah ternyata MongoDB secara resmi tidak mendukungnya! Saya telah menautkan ke masalah di JIRA di mana mereka menjelaskannya. Sayangnya, ini membuat collation secara signifikan kurang bermanfaat. Mari kita minta mereka untuk segera memperbaikinya! Secara teknis, saya perhatikan bahwa meskipun menggunakan indeks, indeks menggunakan "[\"\", {})", sebagai salah satu batas indeksnya, yang selalu mengembalikan semua item dalam indeks, sehingga pemindaian indeks tidak berguna. Tahap selanjutnya dari kueri menyaring hasil tersebut seperti biasa.

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

Pilih masalah ini agar mereka memperbaikinya!https://jira.mongodb.org/ jelajahi/SERVER-29865




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya bisa mengurangi tahap pelepasan dalam pipa agregasi untuk dokumen bersarang?

  2. SQL RPAD()

  3. Urutan mongoid berdasarkan panjang array

  4. Bagaimana agregasi MongoDB di Node.js

  5. Bagaimana cara menggunakan $slice a $filter result di MongoDB?