检索字段的不同值
您可以通过调用在 MongoCollection
对象上使用 distinct()
方法。将文档字段名称作为第一个参数,将您希望将结果转换成的类作为类型参数传递。
以下代码示例展示了如何使用 distinct()
方法,使用的是 sample_mflix
示例数据库中的 movies
集合。文档使用以下 Kotlin 数据类进行建模
data class Movie( val type: String, val languages: List<String>, val countries: List<String>, val awards: Awards){ data class Awards(val wins: Int) }
以下方法调用返回 movies
集合中 countries
字段的每个不同值
collection.distinct<String>(Movie::countries.name)
您可以使用 点表示法 指定文档上的字段或嵌套文档中的字段。以下方法调用返回 awards
嵌套文档中 wins
字段的每个不同值
collection.distinct<Int>("${Movie::awards.name}.${Movie.Awards::wins.name}")
您还可以使用查询过滤器作为第二个参数来限制 MongoDB 实例检索不同值的文档集,如下所示
collection.distinct<String>(Movie::type.name, Filters.eq(Movie::languages.name, "French"))
distinct()
方法返回一个实现 DistinctFlow
类的对象,其中包含访问、组织和遍历结果的方法。 DistinctFlow
将委托给 Kotlin Coroutines 库中的 Flow
接口,允许访问如 first()
和 firstOrNull()
等方法。
有关更多信息,请参阅我们的从 Flow 访问数据的指南.
示例
以下示例检索 movies
集合中 year
文档字段的独特值列表。它使用查询过滤器来匹配包含 "Carl Franklin" 作为 directors
数组值的电影。
运行示例时,您应该看到报告所有包含 Carl Franklin 作为导演的电影的独特年份的输出。
注意
此示例使用连接 URI 连接到 MongoDB 实例。有关连接到您的 MongoDB 实例的更多信息,请参阅连接指南。
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 ...
有关本页所述类和方法的更多信息,请参阅以下资源
distinct() API 文档
distinctFlow API 文档
点表示法 服务器手册条目