过滤器
该Filters 类提供了用于 MongoDB 查询操作符 的静态工厂方法。每个方法都返回一个 Bson
类型的实例,该实例可以传递给任何期望查询过滤器的任何方法。Bson
类型,该类型可以被传递给任何期望查询过滤器的任何方法。
您可以将 Filters
类的方法静态导入,如下面的代码所示
import org.mongodb.scala.model.Filters._
本指南中的示例假设此静态导入。
比较
比较操作符方法包括以下
eq
:匹配等于指定值的值。别名equal
,因为eq
是保留字。gt
:匹配大于指定值的值。gte
:匹配大于或等于指定值的值。lt
:匹配小于指定值的值。lte
:匹配小于或等于指定值的值。ne
:匹配所有不等于指定值的值。别名notEqual
,因为neq
是保留字。in
: 匹配数组中指定的任何值。nin
: 匹配数组中未指定的任何值。empty
: 匹配所有文档。
示例
以下示例创建了一个过滤器,用于选择所有 qty
字段值为 20
的文档。
`eq`("qty", 20) equal("qty", 20)
以下示例创建了一个过滤器,用于选择所有 qty
字段值为 5
或 15
的文档。
in("qty", 5, 15)
以下示例创建了一个空过滤器,因此它会选择所有文档。
empty()
逻辑
逻辑运算符方法包括以下内容
and
: 使用逻辑AND
连接过滤器,并选择同时符合两个过滤器条件的所有文档。or
: 使用逻辑OR
连接过滤器,并选择符合任一过滤器条件的所有文档。not
: 反转查询表达式的效果,并选择不匹配过滤器条件的文档。nor
: 使用逻辑NOR
连接过滤器,并选择不满足两个过滤器条件的所有文档。
示例
以下示例创建了一个过滤器,选择所有qty
字段的值大于20
且user
字段的值等于"jdoe"
的文档。
and(gt("qty", 20), equal("user", "jdoe"))
当查询语言隐式地将过滤器中的所有元素相加时,只有必要时才使用and()
方法生成一个$and
运算符。前面的示例呈现如下:
{ "qty" : { "$gt" : 20 }, "user" : "jdoe" }
以下示例创建了一个过滤器,选择所有price
字段的值等于0.99
或1.99
,并且sale
字段的值是true
或者qty
字段的值小于20
的文档。
and(or(equal("price", 0.99), equal("price", 1.99) or(equal("sale", true), lt("qty", 20)))
由于这个查询多次使用了$or
运算符,因此不能使用隐式$and
操作来构建。该查询呈现如下:
{ "$and" : [ { "$or" : [ { "price" : 0.99 }, { "price" : 1.99 } ] }, { "$or" : [ { "sale" : true }, { "qty" : { "$lt" : 20 } } ] } ] }
数组
数组运算符方法包括以下内容:
all
:匹配包含查询中指定所有元素的数组。elemMatch
:选择字段数组中的元素与指定的所有$elemMatch
条件匹配的文档。size
:选择数组字段为指定大小的文档。
示例
以下示例选择包含"ssl"
和"security"
的tags
数组的文档。
all("tags", "ssl", "security")
元素
元素操作方法包括以下内容
exists
:选择具有指定字段的文档。type
:选择字段类型为指定类型的文档。由于type
是保留词,因此别名为bsonType
。
示例
以下示例选择包含qty
字段且此字段值不等于5
或15
的文档。
and(exists("qty"), nin("qty", 5, 15))
评估
评估操作方法包括以下内容
mod
:对字段的值执行取模运算,并选择具有指定结果的文档。regex
:选择值与指定正则表达式匹配的文档。text
:选择与全文搜索表达式匹配的文档。where
:匹配满足JavaScript表达式的文档。
示例
以下示例假设有一个在字段 abstract
中具有文本索引的集合。它选择包含 abstract
字段包含术语 "coffee"
的文档。
text("coffee")
文本索引允许区分大小写的搜索。以下示例选择包含 abstract
字段包含确切术语 "coffee"
的文档。
text("coffee", TextSearchOptions().caseSensitive(true))
文本索引允许区分重音符号的搜索。以下示例选择包含 abstract
字段包含确切术语 "café"
的文档。
text("café", TextSearchOptions().diacriticSensitive(true))
位运算
位运算符方法包括以下几种:
bitsAllSet
:选择所有指定位都被设置的字段文档。bitsAllClear
:选择所有指定位都被清除的字段文档。bitsAnySet
:选择至少有一个指定位被设置的字段文档。bitsAnyClear
:选择至少有一个指定位被清除的字段文档。
示例
该示例选择具有 bitField
字段且位设置为对应掩码 50
(00110010
)位置的文档
bitsAllSet("bitField", 50)
地理空间
地理空间运算符方法包括以下内容
geoWithin
:选择包含字段值为落在边界GeoJSON
几何形状内的GeoJSON
几何形状的所有文档geoWithinBox
:选择包含网格坐标数据的字段且完全位于指定框内的所有文档geoWithinPolygon
:选择包含网格坐标数据的字段且完全位于指定多边形内的所有文档geoWithinCenter
:选择包含网格坐标数据的字段且完全位于指定圆内的所有文档geoWithinCenterSphere
:使用球面几何选择包含包含地理空间数据(GeoJSON
或旧坐标对)且完全位于指定圆内的几何形状geoIntersects
:选择与GeoJSON
几何形状相交的几何形状。支持$geoIntersects
的2dsphere
索引。near
:返回接近某个点的地理空间对象。需要地理空间索引。支持2dsphere
和2d
索引的$near
。nearSphere
:返回接近球面上某个点的地理空间对象。需要地理空间索引。支持2dsphere
和2d
索引的$nearSphere
。
为了更容易构建基于 GeoJSON
的过滤器,驱动程序还包括完整的 GeoJSON
类层次结构
Point
:表示GeoJSON
的Point
MultiPoint
:表示GeoJSON
的MultiPoint
LineString
:表示GeoJSON
的LineString
MultiLineString
:表示一个GeoJSON
的MultiLineString
。Polygon
:表示一个GeoJSON
的Polygon
。MultiPolygon
:表示一个GeoJSON
的MultiPolygon
。GeometryCollection
:表示一个GeoJSON
的GeometryCollection
。
示例
以下示例创建了一个过滤器,用于选择所有包含给定多边形内 geo
字段的 GeoJSON
Geometry
对象的文档。
val polygon: Polygon = Polygon(Seq(Position(0, 0), Position(4, 0), Position(4, 4), Position(0, 4), Position(0, 0))) geoWithin("geo", polygon)
以下示例创建了一个过滤器,用于选择所有包含与给定 Point
相交的 GeoJSON
Geometry
对象的 geo
字段的文档。
geoIntersects("geo", Point(Position(4, 0)))