Редактиране:има работещо решение. По принцип, ако думата, която търсите, е "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