Оптимизация итерации cursor в MongoDB: метод "continue"
Быстрый ответ
cursor.forEach(doc => {
if (!meetsCriteria(doc)) return; // Оставим он в покое, он не наш кандидат.
process(doc); // Вот это уже другое дело. Обрабатываем!
});
Используйте return
внутри стрелочной функции метода cursor.forEach()
для пропуска элементов, которые не отвечают заданным критериям. Это позволяет имитировать поведение оператора continue
.
Управляйте процессом для улучшения эффективности
Использование цикла for...of
for (let doc of cursor) {
if (!meetsCriteria(doc)) continue; // Не подходит — пропускаем.
await doSomeLengthyOperation(doc); // Идеально подходит — занимаемся.
}
Выберите использование цикла for...of
, если нужна точная контроль над итерациями. Этот цикл позволяет использовать асинхронные операции и операторы continue
и break
.
Эффективная предварительная фильтрация
Примените метод filter
к курсору перед началом итераций, чтобы умешьшить объем данных и ускорить процесс.
const filteredCursor = cursor.filter(doc => meetsCriteria(doc)); // Готовим документы к последующей обработке.
Оптимальное использование логического оператора в forEach
Воспользуйтесь оператором &&
для использования короткого замыкания в cursor.forEach()
. Это позволит выполнять операции только при выполнении определённых условий.
cursor.forEach(doc => {
meetsCriteria(doc) && doSomeLengthyOperation(doc); // Документ соответствует критериям, поэтому его обрабатываем.
});
Грамотное использование return
Применяйте return
до тяжёлых операций, чтобы эффективно управлять выполняемыми действиями.
cursor.forEach(doc => {
if (!canProcessQuickly(doc)) return; // Эта задача займёт слишком много времени.
performQuickOperation(doc); // С удовольствием займёмся этим!
});
Визуализация
Предположим, у вас есть коллекция животных, и вы решили занотировать лишь больших из них:
| Индекс | Животное | Действие |
| ------ | --------- | ---------------------- |
| 1 | 🦒 Жираф | Документировать |
| 2 | 🦓 Зебра | Документировать |
| 3 | 🐜 Муравейник | Игнорировать |
| 4 | 🐘 Слон | Документировать |
Использовать return
— это как проехать мимо муравейника, не замешиваясь его документировать:
// 🚙💨 Вот, муравейник мы промчались быстро. Слишком мал для нашей задачи.
Повышаем производительность работы с курсором
Проходим по курсору, не преобразуя его в массив
Старитесь использовать курсор в его изначальном виде, чтобы избежать накладных расходов на память при обработке больших объемов данных.
Управляйте контекстом в функции обратного вызова
С помощью callback.call()
можно задать желаемый контекст this
в методе forEach
.
cursor.forEach(function(doc) {
if (!this.meetsCriteria(doc)) return; // Не соответствует нашим критериям – пропустим его.
this.process(doc); // Вот это подходит – приступим.
}, myContext);
Обратите внимание, что в каждом вызове функции forEach
контекст this
устанавливается заново.
Продвинутые паттерны использования for...of
Цикл for...of
удобен не только своей классикой; он идеально подходит для асинхронных операций и деструктуризации.
for (const { field1, field2 } of cursor) {
if (checkCondition(field1, field2)) continue; // Эти поля не подходят, продолжим поиск.
await process(field1, field2); // Эти поля именно то, что нам нужно, приступаем к обработке.
}
Полезные материалы
- Самые свежие вопросы по тегам "javascript+foreach+continue" на Stack Overflow — здесь вы найдете множество практических примеров и обсуждений по использованию
continue
в циклах. - Class: Cursor — официальная документация API Node.js MongoDB Driver о
cursor.forEach()
. - continue – JavaScript | MDN — детальная статья на MDN про использование и синтаксис инструкции
continue
в JavaScript. - MongoDB и Node.js: учебник по операциям CRUD | MongoDB — руководство с практическими советами по работе с курсорами MongoDB в JavaScript.
- Циклы: while и for — подробное объяснение принципов работы циклов в JavaScript и использования директивы
continue
. - Функции высшего порядка :: Элегантный JavaScript — глава из книги "Элегантный JavaScript" об использовании
forEach
и функций обратного вызова.