#mongodb
#mongodb
Вопрос:
mongodb find возвращает документы в порядке возрастания «_id», при применении limit (n) к find() он всегда возвращает самые старые n документов (предположим, что _id doc1> _id doc2 означает, что doc1 новее doc2, например, ObjectId ). Я хочу, чтобы он возвращал новейшие n документов, поэтому я делаю:
col.find().sort({"_id":-1}).limit(n)
Это неэффективно? Будет ли mongodb сортировать все документы в ‘col’?
Ответ №1:
_id
Поле по сути является «первичным ключом» и, следовательно, имеет индекс, поэтому на самом деле «сортировки» во всей коллекции нет, в этом случае оно просто проходит по этому первичному индексу в обратном порядке.
При условии, что вы достаточно довольны тем, что это отражает ваши «новейшие» документы, и в обычных обстоятельствах нет оснований полагать иначе, тогда это вернет то, что вы хотите, эффективным способом.
Если вы действительно хотите выполнить сортировку по чему-то другому, например, по метке времени или другому полю, просто создайте индекс в этом поле и отсортируйте, как указано выше. В общих случаях также следует использовать этот индекс и просто возвращать в «порядке убывания» или как указано в направлении вашего сортировки или индекса по умолчанию
db.collection.ensureIndex({ "created": 1 })
Или по умолчанию «по убыванию» :
db.collection.ensureIndex({ "created": -1 })
Затем запрос:
db.collection.find().sort({ "created": -1 })
Таким образом, в основном он не «сортирует» всю коллекцию, когда присутствует индекс для использования. _id
Ключ всегда индексируется.
Также смотрите .ensureIndex()
В документации.