指定查询
概述
本指南介绍了如何使用 Kotlin 同步驱动程序指定查询。
您可以通过创建一个查询过滤器来细化查询返回的文档集。查询过滤器是一个表达式,它指定MongoDB在读取或写入操作中用于匹配文档的搜索条件。在查询过滤器中,您可以提示驱动程序搜索与查询完全匹配的文档,或者您可以将查询过滤器组合起来以表达更复杂的匹配条件。
示例数据
本指南中的示例在名为fruits
的集合上运行操作,该集合包含以下文档
{ "_id": 1, "name": "apples", "quantity": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "quantity": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "quantity": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "quantity": 3, "rating": 5, "color": "yellow" },
此集合中的文档通过以下Kotlin数据类建模
data class Fruit( val id: Int, val name: String, val quantity: Int, val rating: Int, val color: String, val type: List<String> )
以下代码示例展示了如何创建数据库和集合,然后将示例文档插入到您的集合中
val uri = "<connection string URI>" val settings = MongoClientSettings.builder() .applyConnectionString(ConnectionString(uri)) .retryWrites(true) .build() val mongoClient = MongoClient.create(settings) val database = mongoClient.getDatabase("sample_fruit") val collection = database.getCollection<Fruit>("fruits") collection.insertMany(listOf( Fruit(1, "apples", 5, 3, "red", listOf("fuji", "honeycrisp")), Fruit(2, "bananas", 7, 4, "yellow", listOf("cavendish")), Fruit(3, "oranges", 6, 2, null, listOf("naval", "mandarin")), Fruit(4, "pineapples", 3, 5, "yellow", null) ))
精确匹配
字面值查询返回与查询过滤器精确匹配的文档。
以下示例将查询过滤器指定为find()
方法的参数。该代码返回所有具有color
字段值为"yellow"
的文档。
val results = collection.find(eq(Fruit::color.name, "yellow")) results.forEach { result -> println(result); }
Fruit(id=2, name=bananas, quantity=7, rating=4, color=yellow, type=[cavendish]) Fruit(id=4, name=pineapples, quantity=3, rating=5, color=yellow, type=null)
比较运算符
比较运算符将文档字段值与查询过滤器中指定的值进行比较。以下是一些常见的比较运算符列表
$gt
:大于$lte
:小于或等于$ne
:不等于
要查看比较运算符的完整列表,请参阅比较查询运算符指南,该指南位于MongoDB服务器手册中。
以下示例在查询过滤器中指定比较运算符作为find()
方法的参数。该代码返回所有具有rating
字段值大于2
的文档。
val results = collection.find(gt(Fruit::rating.name, 2)) results.forEach { result -> println(result) }
Fruit(id=1, name=apples, quantity=5, rating=3, color=red, type=[fuji, honeycrisp]) Fruit(id=2, name=bananas, quantity=7, rating=4, color=yellow, type=[cavendish]) Fruit(id=4, name=pineapples, quantity=3, rating=5, color=yellow, type=null)
逻辑运算符
逻辑运算符通过应用于两个或更多组表达式结果中的逻辑来匹配文档。以下是一些逻辑运算符列表
$and
,它返回所有匹配所有子句条件的文档$or
,它返回所有匹配一个子句条件的文档$nor
,它返回所有不匹配任何子句条件的文档$not
,它返回所有不匹配表达式的文档
要了解更多关于逻辑运算符的信息,请参阅MongoDB服务器手册中的逻辑查询运算符指南。
以下示例在查询过滤器中指定逻辑运算符作为find()
方法的参数。该代码返回所有具有quantity
字段值大于5
或具有color
字段值为"yellow"
的文档。
val results = collection.find( or( gt(Fruit::quantity.name, 5), eq(Fruit::color.name, "yellow") ) ) results.forEach { result -> println(result) }
Fruit(id=2, name=bananas, quantity=7, rating=4, color=yellow, type=[cavendish]) Fruit(id=3, name=oranges, quantity=6, rating=2, color=null, type=[naval, mandarin]) Fruit(id=4, name=pineapples, quantity=3, rating=5, color=yellow, type=null)
数组运算符
数组运算符根据数组字段中元素的值或数量来匹配文档。以下是可用数组运算符的列表:
$all
,返回包含查询中所有元素的数组文档$elemMatch
,如果数组字段中的元素匹配查询中的所有条件,则返回文档$size
,返回所有具有指定大小的数组的文档
要了解有关数组运算符的更多信息,请参阅 MongoDB 服务器手册中的数组查询运算符指南。
以下示例在查询过滤器中指定数组运算符作为 find()
方法的参数。该代码返回所有具有包含恰好 2
个元素的 type
数组字段的文档。
val results = collection.find(size(Fruit::type.name, 2)) results.forEach { result -> println(result) }
Fruit(id=1, name=apples, quantity=5, rating=3, color=red, type=[fuji, honeycrisp]) Fruit(id=3, name=oranges, quantity=6, rating=2, color=null, type=[naval, mandarin])
元素运算符
元素运算符根据字段的 presence 或 type 查询数据。
要了解有关元素运算符的更多信息,请参阅 MongoDB 服务器手册中的元素查询运算符指南。
以下示例在查询过滤器中指定元素运算符作为 find()
方法的参数。该代码返回所有具有 color
字段的文档。
val results = collection.find(exists(Fruit::color.name)) results.forEach { result -> println(result) }
Fruit(id=1, name=apples, quantity=5, rating=3, color=red, type=[fuji, honeycrisp]) Fruit(id=2, name=bananas, quantity=7, rating=4, color=yellow, type=[cavendish]) Fruit(id=4, name=pineapples, quantity=3, rating=5, color=yellow, type=null)
评估运算符
评估运算符根据对单个字段或整个集合文档的评估返回数据。
以下是一些常见的评估运算符列表:
$text
,在文档上执行文本搜索$regex
,它返回与指定正则表达式匹配的文档$mod
,它对一个字段的值执行模运算,并返回余数为指定值的文档
要查看评估运算符的完整列表,请参阅MongoDB服务器手册中的评估查询运算符指南。
以下示例在查询过滤器中指定评估运算符,作为find()
方法的参数。该代码使用正则表达式返回所有具有至少两个连续"p"
字符的name
字段值的文档。
val results = collection.find(regex(Fruit::name.name, "p{2,}")) results.forEach { result -> println(result) }
Fruit(id=1, name=apples, quantity=5, rating=3, color=red, type=[fuji, honeycrisp]) Fruit(id=4, name=pineapples, quantity=3, rating=5, color=yellow, type=null)
更多信息
要了解有关查询文档的更多信息,请参阅MongoDB服务器手册中的查询文档指南。
要了解更多关于使用Kotlin Sync驱动程序检索文档的信息,请参阅检索数据.
API 文档
要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档