Как найти все документы из частичного индекса в MongoDB?

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