Курсор предоставляет ряд полезных методов для упрощения операций чтения. Рассмотрим методы 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, которые будут рассмотрены позже.