Menu Docs
Página inicial do Docs
/ / /
Driver de Kotlin Sync
/

Acessar dados de um cursor

Nesta página

  • Visão geral
  • Acesse o conteúdo do cursor iterativamente
  • Recuperar documentos individualmente
  • Recuperar todos os documentos
  • Cursores persistentes
  • Solução de problemas
  • Documentação da API

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.

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(
@BsonId
val id: ObjectId,
val name: String
)

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() .

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)

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)
...

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 .

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.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

Voltar

Recuperar valores de campo distintos