筛选构建器
Overview
在本指南中,您可以了解如何使用构建器在 MongoDB Kotlin 驱动程序中为查询指定筛选器。
构建器是MongoDB Kotlin驾驶员提供的类,可帮助您构建 BSON对象。 要学习;了解更多信息,请参阅我们的构建者指南。
筛选器是用于根据指定条件限制查询结果的操作。 筛选器是在collection中查找与搜索条件匹配的信息的有用工具。
您可以在以下位置使用筛选器:
作为
find()
方法的参数在聚合管道的匹配阶段
作为
deleteOne()
或deleteMany()
方法的参数作为
updateOne()
或updateMany()
方法的参数
使用筛选器的查询结果的部分示例如下:
价格超过 0 美元但低于 25 美元的商品。
不含麸质且热量低于 500 卡路里的食物。
一篇提到“辣”的美食评论家评论。
本指南通过以下类型的操作符示例向您展示如何使用构建者:
Filters
类为所有 MongoDB 查询操作符提供静态工厂方法。每个方法都返回一个 BSON 类型的实例,您可以将其传递给任何需要查询筛选器的方法。
本指南中的大多数 Filters
示例都使用以下示例集合 paints
:
{ "_id": 1, "color": "red", "qty": 5, "vendor": ["A"] } { "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] } { "_id": 3, "color": "blue", "qty": 8, "vendor": ["B", "A"] } { "_id": 4, "color": "white", "qty": 6, "vendor": ["D"] } { "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] } { "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] } { "_id": 7, "color": "green", "qty": 8,"vendor": ["B", "C"] } { "_id": 8, "color": "orange", "qty": 7, "vendor": ["A", "D"] }
paints
collection中的这些文档由以下数据类建模,与 Kotlin 驱动程序一起使用:
data class PaintOrder( val id: Int, val qty: Int, val color: String, val vendors: List<String> = mutableListOf() )
对比
比较过滤器包括将文档中的值与指定值进行比较的所有操作符。
Filters
比较操作符方法包括:
比较方法 | matches |
---|---|
等于指定值的值。 | |
值大于指定值。 | |
值小于或等于指定值。 | |
值小于指定的值。 | |
值小于或等于指定的值。 | |
值不等于指定的值。 | |
数组中指定的任何值。 | |
没有数组中指定的值。 | |
所有文档。 |
以下示例创建一个筛选器,用于匹配 paints
集合中 qty
字段的值等于“5 ”的所有文档:
val equalComparison = Filters.eq(PaintOrder::qty.name, 5) val resultsFlow = collection.find(equalComparison) resultsFlow.collect { println(it) }
PaintOrder(id=1, qty=5, color=red, vendors=[A]) PaintOrder(id=6, qty=5, color=pink, vendors=[C])
以下示例创建一个过滤器,该过滤器匹配 paints
集合中 qty
字段的值大于或等于“10”的所有文档:
val gteComparison = Filters.gte(PaintOrder::qty.name, 10) val resultsFlow = collection.find(gteComparison) resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D]) PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B])
以下示例创建一个筛选器,用于匹配 paints
集合中所有文档,因为谓词为空:
val emptyComparison = Filters.empty() val resultsFlow = collection.find(emptyComparison) resultsFlow.collect { println(it) }
PaintOrder(id=1, qty=5, color=red, vendors=[A]) PaintOrder(id=2, qty=10, color=purple, vendors=[C, D]) PaintOrder(id=3, qty=8, color=blue, vendors=[B, A]) PaintOrder(id=4, qty=6, color=white, vendors=[D]) PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B]) PaintOrder(id=6, qty=5, color=pink, vendors=[C]) PaintOrder(id=7, qty=8, color=green, vendors=[B, C]) PaintOrder(id=8, qty=7, color=orange, vendors=[A, D])
逻辑
逻辑操作符根据指定方法的条件执行逻辑操作。
Filters
逻辑操作符方法包括:
逻辑方法 | matches |
---|---|
具有所有筛选器条件的文档。此运算符使用逻辑 | |
具有任一筛选器条件的文档。此操作符使用逻辑 | |
不符合筛选条件的文档。 | |
无法匹配两个筛选器的文档。此运算符使用逻辑 |
以下示例创建一个筛选器,用于匹配 paints
集合中 qty
字段的值大于“8”或 color
字段的值等于“pink”的文档:
val orComparison = Filters.or( Filters.gt(PaintOrder::qty.name, 8), Filters.eq(PaintOrder::color.name, "pink") ) val resultsFlow = collection.find(orComparison) resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D]) PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B]) PaintOrder(id=6, qty=5, color=pink, vendors=[C])
数组
数组运算符会对文档中的数组字段求值。
Filters
数组操作符方法包括:
数组方法 | matches |
---|---|
记录数组字段是否包含查询中指定的每个元素。 | |
如果数组字段中的元素与所有指定的条件均匹配,则选择文档。 | |
文档(如果数组字段是指定数量的元素)。 |
以下示例会将文档与 paints
集合中同时包含“A”和“D”的 vendors
数组进行匹配:
val search = listOf("A", "D") val allComparison = Filters.all(PaintOrder::vendors.name, search) val resultsFlow = collection.find(allComparison) resultsFlow.collect { println(it) }
PaintOrder(id=8, qty=7, color=orange, vendors=[A, D])
元素
元素运算符会计算指定字段的性质。
Filters
元素操作符方法包括:
以下示例匹配具有 qty
字段且其值不等于 paints
集合中的“5”或“8”的文档:
val existsComparison = Filters.and(Filters.exists(PaintOrder::qty.name), Filters.nin("qty", 5, 8)) val resultsFlow = collection.find(existsComparison) resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D]) PaintOrder(id=4, qty=6, color=white, vendors=[D]) PaintOrder(id=5, qty=11, color=yellow, vendors=[A, B]) PaintOrder(id=8, qty=7, color=orange, vendors=[A, D])
求值
评估操作符可评估一个文档中任何字段的值。
Filters
评估操作符方法包括:
评估方法 | matches |
---|---|
对字段值进行模运算包含指定结果的文档。 | |
其值包含指定正则表达式的文档。 | |
包含指定全文搜索表达式的文档。 | |
包含指定 JavaScript 表达式的文档。 |
以下示例匹配 paints
集合中具有以字母“p”开头的 color
字段的文档:
val regexComparison = Filters.regex(PaintOrder::color.name, "^p") val resultsFlow = collection.find(regexComparison) resultsFlow.collect { println(it) }
PaintOrder(id=2, qty=10, color=purple, vendors=[C, D]) PaintOrder(id=6, qty=5, color=pink, vendors=[C])
Bitwise
按位操作符将数字转换为其二进制值,以计算其位。
Filters
按位操作符方法包括:
按位法 | matches |
---|---|
字段指定位已设置的文档(即为"1")。 | |
字段指定位已清除的文档(即为"0")。 | |
字段至少一个指定位已设置的文档(即为"1")。 | |
字段中至少有一个指定位已清除的文档(即“0”)。 |
The following example matches documents that have a decimalValue
field with bits set at positions of the corresponding bitmask "34" (i.e. “00100010”)在此binary_numbers
collection中:
{ "_id": 9, "decimalValue": 54, "binaryValue": "00110110" } { "_id": 10, "decimalValue": 20, "binaryValue": "00010100" } { "_id": 11, "decimalValue": 68, "binaryValue": "1000100" } { "_id": 12, "decimalValue": 102, "binaryValue": "01100110" }
data class BinaryNumber( val id: Int, val decimalValue: Int, val binaryValue: String ) val binaryCollection = database.getCollection<BinaryNumber>("binary_numbers") val bitmask = 34.toLong() // 00100010 in binary val bitsComparison = Filters.bitsAllSet(BinaryNumber::decimalValue.name, bitmask) val resultsFlow = binaryCollection.find(bitsComparison) resultsFlow.collect { println(it) }
BinaryNumber(id=1, decimalValue=54, binaryValue=00110110) BinaryNumber(id=4, decimalValue=102, binaryValue=01100110)
地理空间
地理空间操作符用于评估指定的坐标及其与形状或位置的关系。
Filters
地理空间操作符方法包括:
地理空间方法 | matches |
---|---|
包含属于边界 GeoJSON 几何图形的 GeoJSON 几何图形值的文档。 | |
包含指定框中存在的坐标值的文档。 | |
包含指定多边形中存在的坐标值的文档。 | |
包含存在于指定圆形内的坐标值的文档。 | |
包含存在于指定圆形内的地理空间数据值(GeoJSON 或传统坐标对)的几何(使用球面几何)。 | |
与 GeoJSON 几何图形相交的几何图形。 | |
靠近某个点的地理空间对象。需要地理空间索引。 | |
靠近球面上某个点的地理空间对象。需要地理空间索引。 |
以下示例创建一个筛选器,用于匹配以下文档: point
字段包含属于此stores
集合中的给定多边形内的 GeoJSON 几何图形:
{ "_id": 13, "coordinates": { "type": "Point", "coordinates": [2.0, 2.0] } } { "_id": 14, "coordinates": { "type": "Point", "coordinates": [5.0, 6.0] } } { "_id": 15, "coordinates": { "type": "Point", "coordinates": [1.0, 3.0] } } { "_id": 16, "coordinates": { "type": "Point", "coordinates": [4.0, 7.0] } }
data class Store( val id: Int, val name: String, val coordinates: Point ) val collection = database.getCollection<Store>("stores") val square = Polygon(listOf( Position(0.0, 0.0), Position(4.0, 0.0), Position(4.0, 4.0), Position(0.0, 4.0), Position(0.0, 0.0))) val geoWithinComparison = Filters.geoWithin(Store::coordinates.name, square) val resultsFlow = collection.find(geoWithinComparison) resultsFlow.collect { println(it) }
Store(id=13, name=Store 13, coordinates=Point{coordinate=Position{values=[2.0, 2.0]}}) Store(id=15, name=Store 15, coordinates=Point{coordinate=Position{values=[1.0, 3.0]}})