#mongodb #indexing
#mongodb #индексирование
Вопрос:
Я использую Mongo версии 4.2и пытаюсь ограничить количество документов, сканируемых с помощью MaxScan. Я пробовал «ограничить», но я считаю, что это извлекает все соответствующие документы, а затем разрезает массив, я на самом деле хочу запретить mongo сканировать последние 5 документов. Вот ошибка, которую я получаю:
db.movies.find({title: 'Godfather'}).maxScan(5)
Error: error: {
"operationTime" : Timestamp(1598049657, 1),
"ok" : 0,
"errmsg" : "Failed to parse: { find: "content_movies", filter: { title: "Godfather" }, maxScan: 5.0, lsid: { id: UUID("de0fad49-6cd1-425f-896a-77aa7229e4f0") }, $clusterTime: { clusterTime: Timestamp(1598049547, 1), signature: { hash: BinData(0, 98F9B39F0F6B9E8088947EF37506EA8B17F8AFAA), keyId: 6838904097895088131 } }, $db: "PRODUCTION" }. Unrecognized field 'maxScan'.",
"code" : 9,
"codeName" : "FailedToParse",
"$clusterTime" : {
"clusterTime" : Timestamp(1598049657, 1),
"signature" : {
"hash" : BinData(0,"/oI 65SAR7fEGyp9yilR PFG3KQ="),
"keyId" : NumberLong("6838904097895088131")
}
}
}
Ценю вашу помощь.
Комментарии:
1. Mongo удалил опцию MaxScan в 4.2. Эта ссылка — bookstack.cn/read/mongodb-4.2-manual /… — предлагает вместо этого использовать опцию maxTimeMS. Однако этот параметр не подходит для вашего варианта использования.
2. Я серьезно сомневаюсь, что Mongo извлек бы все документы перед нарезкой, за исключением необходимости делать это, потому что другая операция в запросе, такая как сортировка. Представьте чрезвычайно большую коллекцию и запрос, который соответствует большинству документов. Было бы глупо и пагубно для Mongo извлекать и кэшировать все совпадения, когда пользователю нужны только первые пять.
Ответ №1:
MaxScan удален в версии 4.2.
MongoDB удаляет устаревшую опцию MaxScan для команды find и вспомогательный курсор оболочки mongo.MaxScan(). Используйте либо опцию maxTimeMS для команды find, либо вспомогательный курсор.maxTimeMS() вместо этого.
Я действительно хочу остановить mongo от сканирования первых 5 документов
Используйте для этого limit.