Mongodb: использование функции min в коллекции только с индексом по умолчанию (_id) - PullRequest
1 голос
/ 14 марта 2020

Я хочу получить последние 20 документов из моей большой коллекции эффективным способом.

Эта SO запись предложила это эффективное решение - , но оно не отвечает на мой вопрос, потому что мой вопрос конкретно касается _id index -:

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

Однако моя коллекция содержит индекс по умолчанию (_id). Я просто не уверен, каковы будут минимальные критерии - я, очевидно, не хочу жестко кодировать значение _id, так как коллекция периодически очищается.

itemsCollection.find().min(<minCriteria>).hint({_id:1}).limit(20)

Есть ли способ использовать min с индексом _id? Или мой единственный вариант создания нового индекса?

1 Ответ

0 голосов
/ 14 марта 2020

Да, вы можете использовать min с индексом _id, если ваш <minCriteria> ссылается только на поле _id.

Если ваши минимальные критерии не совпадают с _id, вам потребуется создайте индекс по этим критериям, чтобы этот запрос не был полным сканированием коллекции.

Метод курсора min() предназначен для установления нижней границы сканирования индекса, который будет обслуживать запрос. Вероятно, это не то, что вы ищете для получения самых последних добавленных документов.

Предполагая, что поле _id каждого документа содержит ObjectId или какое-либо другое значение, которое сортируется в том порядке, в котором они были вставив, вы можете, как отмечено в комментариях, выполнить обратную сортировку по _id и ограничить количество требуемых документов, что может быть очень эффективным.

Этот запрос должен автоматически использовать индекс _id:

db.itemsCollection.find().sort({_id:-1}).limit(20)

Часть даты ObjectId определяется системой, создающей значение, которое в некоторых случаях является сервером клиент / приложение. Это означает, что смещение часов может повлиять на порядок.

Если вы хотите получить документы, которые были недавно добавлены в коллекцию, вы можете использовать естественный порядок:

db.itemsCollection.find().sort({$natural:-1}).limit(20)

Это не ' Не используйте индекс, но он все равно должен быть достаточно производительным, поскольку он будет сканировать только количество документов, которые вы хотите вернуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...