Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver de Kotlin Sync
/ /

Acessar dados de um cursor

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.

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

Valores de campo distintos

Nesta página