#mongodb #indexing
#mongodb #индексирование
Вопрос:
Предположим, у меня есть база users
данных с частичным индексом:
db.users.createIndex(
{ username: 1 },
{ unique: true, partialFilterExpression: { age: { $gte: 21 } } }
)
Я хочу найти все документы для запроса:
db.users.find(
{age: { $gte: 21 }}
)
Однако этот запрос не будет использовать мой индекс, несмотря на то, что все, что мне нужно, это найти все документы из индекса.
Что я должен сделать, чтобы использовать этот индекс для своих целей?
Комментарии:
1. Нет, потому что нет индекса на
age
Ответ №1:
Попробуйте выполнить этот запрос
db.users.find({ username:{ $ne:null }, age:{ $gte: 21 }})
Если у вас есть нулевые пользователи, попробуйте:
db.users.find({$or:[{username:{ $ne:null}},{username: {$eq:null }}], age:{ $gte: 21 }})
Соображения
- MongoDB требует, чтобы индексированное поле было в запросе, чтобы использовать индекс
- Могут быть и другие подходящие условия (
$exists
не сработают), но я нахожу это достаточно полезным. - Добавьте
.explain()
, чтобы увидеть проанализированный запрос и использование индексов. - Проверено
Комментарии:
1. Но что, если я хочу получить все документы из индекса, а не только те, в которых имя пользователя не равно null. Могу ли я это сделать?
2. Попробуйте новый, я просто подумал, что потребуется имя пользователя, поэтому оно не может быть нулевым. @GiorgiyPopov добавьте
.explain()
, если хотите увидеть обработанный запрос
Ответ №2:
Я думаю, это тоже должно работать (но я не тестировал):
db.users.find({}).min({}).hint({ username: 1 })