Допустим, у меня есть коллекция монго с text index
в поле itemName
с этими 3 документами:
{
_id: ...,
itemName: 'Mashed carrots with big carrot pieces',
price: 1.29
},
{
_id: ...,
itemName: 'Carrot juice',
price: 0.79
},
{
_id: ...,
itemName: 'Apple juice',
price: 1.49
}
Затем я выполняю запрос следующим образом:
db.items.find({ $text: { $search: 'Car' } }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } );
Как заставить mongo возвращать документы, начинающиеся с "Car" (без учета регистра) до возврата любых других документов, также содержащих "Car" где-то в строке itemName
?
Итак, я хочу получить документы в следующем порядке:
[
{..., itemName: 'Carrot Juice', ...},
{..., itemName: 'Mashed carrots with big carrot pieces', ...}
]
Конечно, это предназначено для использования в функции поиска, поэтому имеет смысл показывать пользователю элементы, начинающиеся с его строки поиска, прежде чем показывать какие-либо другие элементы после этого.
До сих пор я использовал стандартное регулярное выражение, но здесь производительность, конечно, намного хуже! + так как я должен искать без учета регистра, согласно документам, обычное регулярное выражение вообще не использует никаких индексов?!
ИЗМЕНИТЬ:
Кроме того, иногда поведение $text
очень странное. Например, у меня есть около 10-15 элементов, где itemName
начинается со слова "Zwiebel". Этот запрос
db.items.find({ $text: { $search: "Zwiebel" }, supplier_id: 'iNTJHEf5YgBPicTrJ' }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } );
работает как шарм и возвращает все эти документы, в то время как этот запрос
db.items.find({ $text: { $search: "Zwie" }, supplier_id: 'iNTJHEf5YgBPicTrJ' }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } );
ничего не возвращает! Только заменив "Zwiebel" на "Zwie" в файле $search
.
Я реально не понимаю, как это возможно?!
лучший, П