2013-11-01 6 views
1

Всякий раз, когда мы делаем db.Collection.find(). Сортировки(), только наш выход сортируется, а не сама коллекция,коллекция Сортировать постоянно в MongoDB

т.е. если я делать db.collection.find(), то я вижу оригинальную коллекцию, а не отсортированную.

Есть ли способ сортировки самой коллекции, только сортировки вывода?

Экспорт отсортированного результата в новую коллекцию также будет работать.

+0

Вы можете использовать orderby для сортировки своей коллекции – LHH

+3

Есть ли у вас конкретная причина? Для сохраненных документов нет неотъемлемого «заказа». Если вы хотите сортировать конкретное поле часто, то создайте для него индекс. –

+0

@rubyist, то же самое, что и делать sort(). То, что он спрашивает, - это если есть способ сортировки навсегда сортировки документов заказов, хранящихся в коллекции, что не так. –

ответ

1

Кроме того, я не вижу никаких причин для этого (индекс на поле, на котором вы собираетесь сортировать это поможет вам получить этот вид быстро), вот это решение для вашей проблемы:

You есть ваша коллекция тест таким образом

{ "_id" : ObjectId("5273f6987c6c502364ddfe94"), "n" : 5 } 
{ "_id" : ObjectId("5273f6e57c6c502364ddfe95"), "n" : 14} 
{ "_id" : ObjectId("5273f6ee7c6c502364ddfe96"), "n" : -5} 

Тогда следующая команда создаст отсортированный коллекцию для вас

db.test.find().sort({n : 1}).forEach(function(e){ 
    db.testSorted.insert(e); 
}) 

совершенно таким же образом, вы можете достичь с помощью этого (Который я предполагаю, мог бы выполнить быстрее, но я не сделал каких-либо испытаний):

db.testSorted.insert(db.test.find().sort({n : 1}).toArray()); 

И чтобы этот ответ полным, и я понимаю, что это перебор, вы можете сделать это с aggregation framework option $out.

Просто выделите: со всем этим вы можете решить большую проблему: сохранить в другую коллекцию какую-то модификацию/подмножество предыдущей коллекции.

+0

Порядок вставки гарантируется только для [ capped collection] (http://docs.mongodb.org/manual/core/capped-collections/), поэтому это предложение не поддерживает истинную сортированную коллекцию, как вы предлагаете. Документы в обычной коллекции хранятся в [естественном порядке] (http://docs.mongodb.org/manual/reference/glossary/#term-natural-order), на которые влияют перемещения документов (когда документ растет больше, чем выделенное место для записи) и удаления (свободное место может быть повторно использовано для вставленных/перемещенных документов). Индекс является подходящим способом возврата документов в ожидаемом порядке сортировки. – Stennie

+0

@Stennie спасибо за рассказ о возможной проблеме с ходами. Но я не сказал, что это создаст коллекцию, которая будет сортироваться все время после этого. Я только что сказал, что после того, как операция будет завершена, коллекция будет сортироваться. Если вы будете делать обновления или новые вставки в коллекции, заказ не будет сохранен. Я также подчеркнул, что единственный способ - найти сорт. –

0

Документы в коллекции хранятся в natural order, что зависит от перемещения документа (при увеличении объема документа, превышающего выделенное место записи) и удаления (свободное место может быть повторно использовано для вставленных/перемещенных документов). В настоящее время (как и у MongoDB 2.4) нет возможности контролировать порядок документов на диске, кроме использования capped collection, который представляет собой сборник фиксированного размера, который поддерживает порядок вставки, но подлежит number of restrictions.

Индекс - это подходящий способ эффективного возврата документов в ожидаемом порядке сортировки. Для получения дополнительной информации см.: Using Indexes to Sort Query Results в руководстве MongoDB.

Связанная функция: clustered index, которая хранит документы на диске в соответствии с порядком индекса. Это не текущая функция MongoDB, хотя она была запрошена (см. SERVER-3294).

Смежные вопросы