Acessar dados de um cursor
Nesta página
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.
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: