Puedes recuperar una lista de valores distintos para un campo en una colección llamando a la distinct() método en un objeto MongoCollection. Pasa el nombre del campo del documento como el primer parámetro y la clase a la que deseas convertir los resultados como el parámetro de tipo.
Los siguientes fragmentos demuestran el método distinct() usando la colección movies en la base de datos de ejemplo sample_mflix. Los documentos se modelan con la siguiente clase de datos de Kotlin:
data class Movie( val type: String, val languages: List<String>, val countries: List<String>, val awards: Awards){ data class Awards(val wins: Int) }
La siguiente llamada al método devuelve cada valor distinto del campo countries en la colección movies:
collection.distinct<String>(Movie::countries.name)
Puedes especificar un campo en el documento o uno dentro de un documento incrustado usando la notación de punto. La siguiente llamada de método devuelve cada valor distinto del campo wins en el documento incrustado awards:
collection.distinct<Int>("${Movie::awards.name}.${Movie.Awards::wins.name}")
También puede limitar el conjunto de documentos de los que su instancia de MongoDB recupera valores distintos mediante un filtro de query como segundo parámetro, de la siguiente manera:
collection.distinct<String>(Movie::type.name, Filters.eq(Movie::languages.name, "French"))
El método distinct() devuelve un objeto que implementa la clase DistinctFlow, que contiene métodos para acceder, organizar y recorrer los resultados. DistinctFlow delega a la interfaz Flow desde la biblioteca Kotlin Coroutines, lo que permite el acceso a métodos como first() y firstOrNull().
Para obtener más información, consulta nuestro Guía sobre cómo acceder a datos desde un flujo.
Ejemplo
El siguiente ejemplo recupera una lista de valores distintos para el campo year del documento de la colección movies. Utiliza un filtro de query para hacer coincidir películas que incluyan "Carl Franklin" como uno de los valores en el arreglo directors.
Cuando ejecutes el ejemplo, deberías ver una salida que informe cada año distinto de todas las películas en las que Carl Franklin figuró como director.
Nota
Este ejemplo se conecta a una instancia de MongoDB mediante un URI de conexión. Para saber más sobre cómo conectarse a su instancia de MongoDB, consulte la guía de conexión.
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 obtener información adicional sobre las clases y métodos mencionados en esta página, consulte los siguientes recursos:
distinct() Documentación de la API
distinctFlow Documentación de la API
Entrada manual del servidor denotación de puntos