2015-08-24 1 views
0

Я использую mongodb через оболочку mongo для запроса большой коллекции. По какой-то причине через 90 секунд оболочка манго, похоже, останавливает мой запрос, и ничего не возвращается.Время запроса запроса Mongo shell на 90 секунд

Я пробовал следующие две команды, но ничего не верну. Через 90 секунд это просто дает мне новую строку, которую я могу ввести в другую команду.

db.cards.find ("Поле": "Что-то"). MaxTimeMS (9999999) db.cards.find ("Поле": "Что-то"). AddOption (DBQuery.Option.tailable)

db.cards.find() возвращает результаты, но все с параметрами синхронизируется с точностью ровно 90 секунд и ничего не возвращается.

Любая помощь была бы принята с благодарностью.

+0

Попробуйте использовать 'db.cards.find(). AddOption (DBQuery.Option.noTimeout);'. Сколько документов у вас есть в коллекции карт? – Rudra

ответ

1

Учитывая уровень детализации в вашем вопросе, я собираюсь сосредоточиться на «запросе большой коллекции» и предположить, что вы используете механизм хранения MMAPv1 без покрытия индекса по вашему запросу.

Вы связаны диском?

Учитывая приведенные выше предположения, вы можете циклически перемещать данные между ОЗУ и диском. У Mongo установлен предел по умолчанию на уровне 100 МБ, поэтому, если ваш запрос должен проверять множество документов (без индексации), постраничными могут быть данные подкачки с диска на ОЗУ. Я слышал о оболочке манго, которая описывается или блокируется/завершается при превышении ограничений памяти.

32-битные системы также могут создавать серьезные ограничения памяти для больших коллекций.

Вы можете посмотреть свой монитор активности на конкретной ОС, чтобы узнать, является ли это вашей проблемой.

Насколько велика ваша коллекция?

Дальше, насколько велика ваша коллекция? Вы можете show collections и посмотреть физический размер коллекции, а также db.cards.count(), чтобы увидеть свой рекорд. Это помогает количественно определить «большую коллекцию».

ПРИМЕЧАНИЕ: вам могут понадобиться расширения mongo-hacker, чтобы увидеть использование коллекции дисков в коллекциях шоу.

Монго исследование оболочки

В Монго оболочки, у вас есть еще несколько мест, чтобы смотреть. По умолчанию mongo будет записывать медленные запросы (> 100 мс). После истечения 90 с тайм-аута:

db.adminCommand({getLog: "global" }) 

и ищите записи журнала медленного запроса.

Далее посмотрите на ваш план запросов-выигрышей.

var e = db.cards.explain() 
e.find("Field":"Something") 

Я предполагаю, что вы увидите

"stage": "COLLSCAN", 

Это означает, что вы делаете полный сбор сканирования и вам необходимо покрытие индекса для вашего запроса (хорошая идея для запросов и сортировки).

Предложения

Вы должны иметь по крайней мере, частичное покрытие индекса на любом производстве запроса. Правильный индекс должен решить вашу проблему (если у вас нет документов> 16 МБ).

Другой подход (который я не рекомендую - индексация лучше), чтобы использовать курсор вместо

var cursor = db.cards.find("Field":"Something") 
while (cursor.hasNext()) { 
    print(tojson(cursor.next())); 
} 

В зависимости от основной причины, это может работать для вас.