операция ограничения mongodb по извлечению новейших документов

#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() В документации.