Я отвечу ужасным, нарисованным рукой комиком. Второе изображение является причиной того, что result
является undefined
в вашем примере кода.
Вы используете ограничение 32 МБ для сортировки в памяти:
https://docs.mongodb.com/manual/reference/limits/#Sort-Operations
Добавьте индекс в поле сортировки. Это позволяет MongoDB передавать вам документы в отсортированном порядке, а не пытаться загружать их все в память на сервере и сортировать их в памяти перед отправкой их клиенту.
Как сказано в kumar_harsh
в разделе комментариев, я хотел бы добавить еще одну точку.
Вы можете просмотреть текущее использование буфера, используя приведенную ниже команду в базе данных admin
:
> use admin
switched to db admin
> db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } )
{ "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }
Он имеет значение по умолчанию 32 МБ (33554432 байт). В этом случае у вас недостаточно данных буфера, поэтому вы можете увеличить ограничение буфера с помощью своего собственного оптимального значения, например, 50 МБ, как показано ниже:
> db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432})
{ "was" : 33554432, "ok" : 1 }
Мы также можем установить этот предел на постоянной основе с помощью приведенного ниже параметра в файле конфигурации mongodb:
setParameter=internalQueryExecMaxBlockingSortBytes=309715200
Надеемся, что это поможет !!!
Note
: Эти команды поддерживают только после версии 3.0 +
Если вы хотите избежать создания индекса (например, вы просто хотите быстро и грязную проверку для изучения данных), вы можете использовать агрегацию с использованием диска:
all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
(Не уверен как это сделать в pymongo, хотя).
Синтаксис JavaScript API для индекса:
db_handle.ensureIndex({executedDate: 1})
решена с индексированием
db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
В моем случае было необходимо исправить индексы nessary в коде и заново их создать:
rake db:mongoid:create_indexes RAILS_ENV=production
Поскольку переполнение памяти не происходит, когда есть необходимый индекс поля.
PS До этого мне пришлось отключать ошибки при создании длинных индексов:
# mongo
MongoDB shell version: 2.6.12
connecting to: test
> db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )