Docs 菜单
Docs 主页
/ / /
Kotlin 协程
/ /

筛选构建器

在此页面上

  • 概述
  • 对比
  • 逻辑
  • 数组
  • 元素
  • 求值
  • 按位
  • 地理空间

在本指南中,您可以了解如何使用构建器在 MongoDB Kotlin 驱动程序中为查询指定筛选器。

构建器是 MongoDB Kotlin 驱动程序提供的类,可帮助您构建 BSON对象。要了解更多信息,请参阅我们的构建器指南。

筛选器是用于根据指定条件限制查询结果的操作。 筛选器是在collection中查找与搜索条件匹配的信息的有用工具。

您可以在以下位置使用筛选器:

  • 作为 find()方法的参数

  • 在聚合管道的匹配阶段

  • 作为deleteOne()deleteMany()方法的参数

  • 作为updateOne()updateMany()方法的参数

使用筛选器的查询结果的部分示例如下:

  • 价格超过 0 美元但低于 25 美元的商品。

  • 不含麸质且热量低于 500 卡路里的食物。

  • 一篇提到“辣”的美食评论家评论。

本指南通过以下类型的操作符示例向您展示如何使用构建者:

  • 对比

  • 逻辑

  • 数组

  • 元素

  • 求值

  • 按位

  • 地理空间

Filters 类为所有 MongoDB 查询操作符提供静态工厂方法。每个方法都返回一个 BSON 类型的实例,您可以将其传递给任何需要查询筛选器的方法。

提示

为了简洁起见,可以选择静态导入过滤器类的所有方法:

import com.mongodb.client.model.Filters.*

本指南中的大多数 Filter 示例都使用以下示例集合 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(
@BsonId 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
具有所有筛选器条件的文档。此运算符使用逻辑 AND 来联接筛选器。
具有任一筛选器条件的文档。此操作符使用逻辑 OR 连接筛选器。
不符合筛选条件的文档。
无法匹配两个筛选器的文档。此运算符使用逻辑 NOR 来联接筛选器。

以下示例创建一个筛选器,用于匹配 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元素操作符方法包括:

元素方法
matches
具有指定字段的文档。
如果字段属于指定类型,则为文档。

以下示例匹配具有 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])

按位操作符将数字转换为其二进制值,以计算其位。

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_numberscollection中:

{ "_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(
@BsonId 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 几何图形相交的几何图形。2dsphere 索引支持 $geoIntersects
靠近某个点的地理空间对象。需要地理空间索引。2dsphere2d 索引支持 $near
靠近球面上某个点的地理空间对象。需要地理空间索引。2dsphere2d 索引支持 $nearSphere

以下示例创建一个筛选器,用于匹配以下文档: 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(
@BsonId 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]}})

后退

聚合构建器

来年

索引构建器