Вопрос:

Mongodb найти возвращаемый документ заказа

mongodb

4009 просмотра

1 ответ

701 Репутация автора

У меня есть коллекция с полем с именем «дата» (также проиндексирован). Содержит значения ггггммдд (пример: 20140731, 20140730, 20140729 ...)

Документы хранятся в порядке убывания на основе даты. Таким образом, коллекция имеет 20140731 как первый документ.

Когда я использую команду find с фильтрами {$ gte: 20140720, $ lte: 20140731}, mongodb возвращает запрос в порядке возрастания поля «дата».

Я знаю, что могу использовать сортировку, но как мне заставить mongodb возвращать результаты в зависимости от порядка их создания?

Спасибо!

Автор: hello mtyj Источник Размещён: 02.08.2014 02:14

Ответы (1)


8 плюса

50674 Репутация автора

Решение

Документы хранятся в естественном порядке

Документы хранятся в порядке убывания на основе даты. Таким образом, коллекция имеет 20140731 как первый документ.

Если вы не используете ограниченную коллекцию , нет гарантии для заказа документов на диске (также называемый естественным порядком ).

При удалении и перемещении документа (когда документ выходит за пределы выделенного ему пространства записи), в свободном списке создается пространство, которое будет использоваться повторно.

Вот быстрый пример, который должен продемонстрировать это в mongoоболочке:

// Start with an empty database & collection
use demodb; db.dropDatabase(); db.order.drop()

// Add some test data
for (i=0; i<1000; i++) {
    db.order.insert({'i': i})
}

// Looks like insertion order! (0..9)
db.order.find({}).limit(10);

// Pause 5s for effect :)
sleep(5000);

// Remove half the entries
db.order.remove({ i: { $lt: 500 }})

// Re-add the missing entries
for (i=0; i<500; i++) {
    db.order.insert({'i': i})
}

// Not the entries you expected .. space from deleted records was reused
db.order.find({}).limit(10)

// Clean up demodb
db.dropDatabase()

Порядок результатов

Когда я использую команду find с фильтрами {$ gte: 20140720, $ lte: 20140731}, mongodb возвращает запрос в порядке возрастания поля «дата».

Если для запроса используется индекс, документы возвращаются в порядке их нахождения в индексе. Вы должны воспользоваться этим при построении индексов для общих запросов (см. Использование индексов для сортировки результатов запросов ).

К вашему сведению, простой индекс (например, on {date:1}) может использоваться для возврата результатов, отсортированных в порядке возрастания или убывания.

Сортировать по ObjectID

Если вы используете ObjectID по умолчанию для MongoDB _id, вы можете отсортировать их { _id: 1 }по приблизительному порядку вставки, поскольку первые 4 байта ObjectID содержат временную метку. Если вы хотите использовать это для сортировки запроса на основе dateприблизительного порядка вставки, вы должны обеспечить индекс {date:1, _id:1}.

Обратите внимание, что ObjectID, как правило, генерируются драйвером клиента, поэтому, если у вас есть смещение часов на серверах приложений (или они _idсоздаются за некоторое время до вставки документа), ObjectID могут не полностью отражать «порядок вставки», как это видно на сервере. Если точность порядка вставки очень важна, как правило, можно сгенерировать ее _idна стороне сервера (подход зависит от драйвера).

Автор: Stennie Размещён: 02.08.2014 08:11
Вопросы из категории :
32x32