MongoDB: next() и hasNext() — итерация курсора

Курсор предоставляет ряд полезных методов для упрощения операций чтения. Рассмотрим методы next, hasNext и objLeftInBatch.

Работа с курсором

Для работы с курсором, полученным методом find, необходимо присвоить его переменной:

let cursor = db.collection.find();

Метод next итерирует по одному документу за раз. hasNext возвращает true, если есть следующий документ, и false в противном случае. objLeftInBatch возвращает количество оставшихся документов в текущем пакете.

Практическое применение

Рассмотрим примеры использования этих методов. Выполним запрос find и присвоим результат переменной cursor:

let cursor = db.collection.find();

Без итерации результаты не отобразятся. Список доступных методов курсора можно получить, введя cursor. и нажав Tab (автодополнение).

Вызов cursor.next() итерирует один документ:

cursor.next()

Повторные вызовы cursor.next() возвращают следующие документы по одному.

В MongoDB native shell:

let cursor = db.collection.find();

cursor.next() возвращает документы по одному.

hasNext() проверяет наличие следующих документов:

cursor.hasNext() // Возвращает true, если документы есть

objLeftInBatch() возвращает количество оставшихся документов в текущем пакете:

cursor.objLeftInBatch() // Возвращает количество оставшихся документов

Например, при batchSize 100 (по умолчанию) после итерации 3 документов, objLeftInBatch() вернет 97.

Вызов cursor без методов возвращает следующий пакет документов (обычно 20):

cursor // Возвращает следующий пакет документов

Итерация продолжается до тех пор, пока cursor.hasNext() не вернет false. После этого cursor.next() вызовет ошибку.

// Итерация до конца курсора...
cursor.hasNext() // Вернет false
cursor.next() // Вызовет ошибку

Итог

Методы next, hasNext и objLeftInBatch позволяют эффективно управлять итерацией курсора. Курсор — итератор, предоставляющий дополнительные возможности, такие как forEach и toArray, которые будут рассмотрены позже.

Что будем искать? Например,программа