MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Chỉ mục không phân biệt chữ hoa chữ thường MongoDB bắt đầu có vấn đề về hiệu suất

Chỉnh sửa:có một giải pháp khả thi. Về cơ bản, nếu từ bạn đang tìm kiếm là "bob", bạn có thể tìm kiếm $ lt:"boc", (nơi bạn tăng ký tự cuối cùng lên một) và $ gte "bob". Điều này sẽ sử dụng chỉ mục. Bạn có thể sử dụng chức năng sau mà tôi đã thực hiện bên dưới (cảnh báo rằng nó không nhất thiết phải không có lỗi nhưng hoạt động khá nhiều) như thế này:

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

Hóa ra MongoDB chính thức không hỗ trợ nó! Tôi đã liên kết với một vấn đề trong JIRA nơi họ làm rõ điều này. Thật không may, điều này làm cho các ảnh ghép trở nên ít hữu ích hơn đáng kể. Hãy bắt tay vào chúng để khắc phục sự cố này sớm! Về mặt kỹ thuật, tôi nhận thấy rằng mặc dù nó đang sử dụng chỉ mục, nhưng chỉ mục sử dụng "[\"\", {})", là một trong những giới hạn chỉ mục của nó, luôn trả về tất cả các mục trong chỉ mục, vì vậy việc quét chỉ mục là vô ích. Giai đoạn tiếp theo của truy vấn lọc qua các kết quả đó như bình thường.

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

Bỏ phiếu cho vấn đề này để nhờ họ khắc phục! https://jira.mongodb.org/ duyệt / SERVER-29865




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nhận giá trị trả về của hàm Reativemongo findAndUpdate

  2. Tìm kiếm Cụm từ Thông dụng MongoDB - Bắt đầu với việc sử dụng trình điều khiển javascript và NodeJS

  3. Xây dựng Newsfeed giống Facebook được cá nhân hóa:SQL, MongoDB?

  4. MongoDB:không thể sử dụng con trỏ để lặp qua tất cả dữ liệu

  5. Giá trị tra cứu MongoDB $ Trở lại Mảng