2015-07-17 2 views
4

Когда я хочу, чтобы перебрать некоторый набор документов, хранящихся в MongoDB из моего Метеор приложение, я могу использовать либоMongoDB: Foreach против выборки + каждый

db.collection.find(...).forEach(function f(doc){ ... }) 

или

var docs = db.collection.find(...).fetch(); 
_.each(docs, function f(doc){ ... }); // using underscore.js 

Какой путь предпочтительнее с точки зрения производительности? Какие минусы и плюсы существуют для обоих вариантов?

+1

@Stennie Вопрос не в 'find' vs' fetch', а о 'forEach' vs' fetch'. –

+1

@DavidWeldon 'forEach' просто выполняет итерацию курсора, возвращаемого' find() ', поэтому я думаю, что это тот же вопрос. – Stennie

+0

@DavidWeldon forEach перемещает курсор один за другим и применяет к нему функцию. fetch принимает весь результат, а затем каждый применяет к нему функцию. Меня интересуют различия в производительности (время и память) этих случаев. –

ответ

3

Эти два утверждения делают в основном то же самое на уровне основного API, который получает курсор и преобразует результаты. Существует, однако, один «ядро» разница о производительности:

  • .forEach() будет tranform результатов курсора «по одному» и обрабатывать функции итератора она предусмотрена.

  • .fetch() с другой стороны, получает «массив» от курсора «все сразу», что означает, что это все «в памяти» в один удар.

Таким образом, несмотря ни на что, ни на самом деле не «быстрее» при выполнении «основной» операции по извлечению из курсора запроса. Однако, не оценивая «выражение» на каждой итерации курсора, «может быть» немного быстрее, поэтому .fetch() может выиграть «немного» здесь.

Большой большой улов, конечно же, «все сейчас в памяти», поэтому есть «накладные расходы» на это. Кроме того, во время .fetch()_.each() еще предстоит обработать, как говорится. «Что вы« набираете »на качелях, которые вы, вероятно,« потеряете »на каруселях».

Без полного бенчмаркинга конкретных случаев «тайминги», вероятно, будут похожи. И общий бенчмаркинг близок к бесполезным, если только он не применяет размер наборов данных, с которыми вы работаете.

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

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