筛选器
过滤器 类为MongoDB查询运算符提供静态工厂方法。每个方法都返回一个 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)))
无法使用隐式$and
操作构造此查询,因为它多次使用$or
操作符。 此查询呈现为以下内容:
{ "$and" : [ { "$or" : [ { "price" : 0.99 }, { "price" : 1.99 } ] }, { "$or" : [ { "sale" : true }, { "qty" : { "$lt" : 20 } } ] } ] }
数组
大量操作符方法包括:
all
:匹配包含查询中指定的所有元素的数组。elemMatch
:如果数组字段中的元素与所有指定的$elemMatch
条件匹配,则选择文档。size
:如果数组字段达到指定大小,则选择文档。
示例
以下示例选择具有tags
大量的文档,该数组包含同时包含"ssl"
和"security"
的文档:
all("tags", "ssl", "security")
元素
元素操作符方法包括:
exists
:选择具有指定字段的文档。type
:如果字段属于指定类型,则选择文档。 别名为bsonType
,因为type
是保留字。
示例
以下示例选择包含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))
Bitwise
按位操作符方法包括:
bitsAllSet
:选择已设立字段的所有指定位的文档。bitsAllClear
:选择字段的所有指定位均已清除的文档。bitsAnySet
:选择至少设立了一个字段的指定位的文档。bitsAnyClear
:选择字段中至少有一个指定位已清除的文档。
示例
该示例选择具有bitField
字段的文档,该字段在相应位掩码50
( 00110010
) 的位置设立了位:
bitsAllSet("bitField", 50)
地理空间
地理空间操作符方法包括:
geoWithin
:选择包含以下字段的所有文档:该字段的值为处于边界GeoJSON
几何图形内的GeoJSON
几何图形。geoWithinBox
:选择包含完全存在于指定框中的具有网格坐标数据的字段的所有文档。geoWithinPolygon
:选择包含完全存在于指定多边形内的具有网格坐标数据的字段的所有文档。geoWithinCenter
:选择包含完全存在于指定圆圈内的具有网格坐标数据的字段的所有文档。geoWithinCenterSphere
:使用球面几何选择包含完全存在于指定圆形内的地理空间数据(GeoJSON
或legacy coordinate pairs )的字段的几何。geoIntersects
:选择与GeoJSON
几何图形相交的几何图形。2dsphere
索引支持$geoIntersects
。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)
以下示例创建了一个过滤,用于选择geo
字段包含与给定Point
相交的GeoJSON
Geometry
对象的所有文档:
geoIntersects("geo", Point(Position(4, 0)))