您可以通过调用collection对象上的distinct() MongoCollection方法来检索字段的不同值的列表。将文档字段名称作为第一个参数进行传递,并将结果转换后的目标类作为类型参数进行传递。
以下代码段演示了使用sample_mflix样本数据库中的moviescollection的distinct()方法。文档使用以下 Kotlin 数据类进行建模:
data class Movie( val type: String, val languages: List<String>, val countries: List<String>, val awards: Awards){ data class Awards(val wins: Int) }
以下方法调用返回moviescollection中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 协程库中的Flow接口,允许访问first()和firstOrNull()等方法。
有关更多信息,请参阅有关从流程访问数据的指南。
例子
以下示例从moviescollection中检索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文档
点符号服务器手册条目