Visão geral
Neste guia, você pode aprender como acessar dados de um cursor com o driver Kotlin Sync.
Um cursor é um mecanismo que retorna os resultados de uma operação de leitura em lotes iteráveis. Como um cursor contém apenas um subconjunto de documentos a qualquer momento, os cursores reduzem o consumo de memória e o número de solicitações que o driver envia ao servidor.
Sempre que o driver Kotlin Sync executa uma operação de leitura que retorna vários documentos, ele retorna automaticamente esses documentos em um cursor.
Dica
Tempo limite do cursor
Você pode definir um tempo limite no cursor para retornar os resultados da consulta. Para saber mais, consulte a seção Cursores do guia Limitar o tempo de execução do servidor.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
A seguinte classe de dados Kotlin modela os documentos nesta coleção:
data class Restaurant( val id: ObjectId, val name: String )
Acesse o conteúdo do cursor iterativamente
Para iterar sobre o conteúdo de um cursor, use o método forEach()
, como mostrado no exemplo a seguir:
val results = collection.find() results.forEach { result -> println(result) }
Alternativamente, utilize o método use()
para implementar um loop no cursor:
val results = collection.find() results.cursor().use { cursor -> while (cursor.hasNext()) { println(resultCursor.next()) } }
Observação
Por padrão, o MongoDB fecha um cursor quando o cliente esgota todos os resultados no cursor. Os exemplos neste guia fecham explicitamente os cursores usando o método close()
.
Recuperar documentos individualmente
Recupere documentos de um cursor individualmente chamando o método next()
.
O exemplo a seguir encontra todos os documentos em "Dunkin' Donuts"
name
com um valor de . Em seguida, ele imprime o primeiro documento no cursor chamando o método next()
.
val results = collection .find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts")) results.cursor().use { cursor -> println(if (cursor.hasNext()) cursor.next() else "No document matches the filter") }
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts)
Recuperar todos os documentos
Aviso
Se o número e o tamanho dos documentos retornados pela sua query excederem a memória disponível do aplicativo, seu programa falhará. Se você espera um conjunto de resultados grande, acesse o cursor iterativamente.
Para recuperar todos os documentos de um cursor, converta o cursor em um List
como mostrado no seguinte exemplo:
val results = collection.find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts")) val resultsList = results.toList() for (result in resultsList) { println(result) }
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42ca0, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42b08, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42cd7, name=Dunkin' Donuts) ...
Cursores persistentes
Ao fazer query em uma collection limitada, você pode usar um cursor persistente que permanece aberto depois que o cliente esgota os resultados em um cursor. Para criar um cursor persistente com collection limitada, especifique CursorType.TailableAwait
para o método cursorType
de um objeto FindIterable
.
O exemplo a seguir cria um cursor persistente em uma collection limitada:
val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
Para saber mais sobre cursores tailable e seu uso, consulte o guia Cursores tailable no manual do MongoDB Server .
Solução de problemas
"CursorNotFound ID de cursor inválido no servidor"
Os cursores no MongoDB podem atingir o tempo limite no servidor se estiverem abertos há muito tempo sem que nenhuma operação seja executada neles. Isso pode levar a uma exceção CursorNotFound
quando você tenta iterar pelo cursor.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: