Recuperar valores distintos de um campo
Você pode recuperar uma lista de valores distintos para um campo em uma coleção ligando para o método distinct()
em um objeto MongoCollection
. Passe o nome do campo do documento como o primeiro parâmetro e a classe para a qual você deseja converter os resultados como o parâmetro do tipo.
Os seguintes trechos demonstram o método distinct()
utilizando a collection movies
no reconhecimento de data center de amostra do sample_mflix
. Os documentos são modelados com a seguinte classe de dados Kotlin:
data class Movie( val type: String, val languages: List<String>, val countries: List<String>, val awards: Awards){ data class Awards(val wins: Int) }
A chamada de método abaixo gera cada valor distinto do campo countries
na collection movies
:
collection.distinct<String>(Movie::countries.name)
Você pode especificar um campo no documento ou dentro de um documento incorporado usando a notação de ponto. A chamada de método abaixo gera cada valor distinto do campo wins
no documento incorporado de awards
:
collection.distinct<Int>("${Movie::awards.name}.${Movie.Awards::wins.name}")
Você também pode limitar o conjunto de documentos dos quais sua instância do MongoDB recupera valores distintos com um filtro de query como segundo parâmetro, da seguinte forma:
collection.distinct<String>(Movie::type.name, Filters.eq(Movie::languages.name, "French"))
O método distinct()
gera um objeto que implementa a classe DistinctFlow
, que contém métodos para acessar, organizar e percorrer os resultados. DistinctFlow
delega para a interface Flow
da biblioteca Kotlin corrotina, permitindo acesso a métodos como first()
e firstOrNull()
.
Para obter mais informações, consulte nosso guia sobre como acessar dados de um fluxo.
Exemplo
O exemplo a seguir recupera uma lista de valores distintos para o campo documento year
da collection movies
. Ele usa um filtro de query para corresponder a filmes que incluem "Carl Franklin" como um dos valores na array directors
.
Ao executar o exemplo, você verá a saída que relata cada ano distinto de todos os filmes que Carl Franklin foi incluído como diretor.
Observação
Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte o Guia de conexão.
import com.mongodb.MongoException import com.mongodb.client.model.Filters import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking data class Movie(val year: Int, val directors: List<String>) fun main() = runBlocking { // Replace the uri string with your MongoDB deployment's connection string val uri = "<connection string uri>" val mongoClient = MongoClient.create(uri) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Movie>("movies") try { val resultsFlow = collection.distinct<Int>( Movie::year.name, Filters.eq(Movie::directors.name, "Carl Franklin") ) resultsFlow.collect { println(it) } } catch (e: MongoException) { System.err.println("An error occurred: $e") } mongoClient.close() }
1992 1995 1998 ...
Para obter informações adicionais sobre as classes e métodos mencionados nesta página, consulte os seguintes recursos:
Documentação da APIdistinct()
Notação de ponto Entrada manual do servidor