“文档” 菜单
文档首页
/ / /
Java (Sync) 驱动程序
/ /

筛选构建器

在此页面上

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

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

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

过滤器是 MongoDB 用于将结果限制为您想要查看的内容的操作。

我们使用筛选器的一些地方是:

  • find()

  • 聚合的匹配阶段

  • deleteOne()/deleteMany()

  • updateOne()/updateMany()

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

  • 价格为 0 至 25 美元的商品

  • 其设施包括室内游泳池和免费停车场的一家酒店

  • 一篇提到 "spicy" 的美食评论家评论

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

  • 对比

  • 逻辑

  • 数组

  • 元素

  • 求值

  • 按位

  • 地理空间

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

提示

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

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

以下示例假定此静态导入。

本指南中的筛选器示例使用以下样本集合:

集合: paint_purchases

{ "_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"] }

集合: binary_numbers

{ "_id": 9, "a": 54, "binaryValue": "00110110" }
{ "_id": 10, "a": 20, "binaryValue": "00010100" }
{ "_id": 11, "a": 68, "binaryValue": "1000100" }
{ "_id": 12, "a": 102, "binaryValue": "01100110" }

集合: geo_points

{ "_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] } }

比较过滤器包括将文档中的值与指定值进行比较的所有操作符。

比较操作符方法包括:

比较方法
matches
eq()
等于指定值的值。
值大于指定值。
值小于或等于指定值。
值小于指定的值。
值小于或等于指定的值。
值不等于指定的值。
数组中指定的任何值。
没有数组中指定的值。
所有文档。

以下示例创建一个筛选器,用于匹配 paint_purchases 集合中 qty 字段的值等于“5 ”的所有文档:

Bson equalComparison = eq("qty", 5);
collection.find(equalComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 1, "color": "red", "qty": 5, "vendor": ["A"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }

以下示例创建一个过滤器,该过滤器匹配 paint_purchases 集合中 qty 字段的值大于或等于“10”的所有文档:

Bson gteComparison = gte("qty", 10);
collection.find(gteComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] }

以下示例创建一个筛选器,用于匹配 paint_purchases 集合中所有文档,因为谓词为空:

Bson emptyComparison = empty();
collection.find(emptyComparison).forEach(doc -> System.out.println(doc.toJson()));

前述查询的输出包括该集合中的所有文档。

{ "_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"] }
...

逻辑操作符根据指定方法的条件执行逻辑操作。

逻辑操作符方法包括:

逻辑方法
matches
具有所有筛选器条件的文档。此运算符使用逻辑 AND 来联接筛选器。
具有任一筛选器条件的文档。此操作符使用逻辑 OR 连接筛选器。
不符合筛选条件的文档。
无法匹配两个筛选器的文档。此运算符使用逻辑 NOR 来联接筛选器。

以下示例创建一个筛选器,用于匹配 paint_purchases 集合中 qty 字段的值大于“8”或 color 字段的值等于“pink”的文档:

Bson orComparison = or(gt("qty", 8), eq("color", "pink"));
collection.find(orComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }

数组运算符会对文档中的数组字段求值。

数组操作符方法包括:

数组方法
matches
记录数组字段是否包含查询中指定的每个元素。
如果数组字段中的元素与所有指定的条件均匹配,则选择文档。
文档(如果数组字段是指定数量的元素)。

以下示例会将文档与 paint_purchases 集合中同时包含“A”和“D”的 vendors 数组进行匹配:

List<String> search = Arrays.asList("A", "D");
Bson allComparison = all("vendor", search);
collection.find(allComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 8, "color": "orange", "qty": 7, "vendor": ["A", "D"] }

元素运算符会计算指定字段的性质。

元素操作符方法包括:

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

以下示例匹配具有 qty 字段且其值不等于 paint_purchases 集合中的“5”或“8”的文档:

Bson existsComparison = and(exists("qty"), nin("qty", 5, 8));
collection.find(existsComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 4, "color": "white", "qty": 6, "vendor": ["D"]}
{ "_id": 5, "color": "yellow", "qty": 11, "vendor": ["A", "B"] }
{ "_id": 8, "color": "orange", "qty": 7, "vendor": ["A", "D"] }

评估操作符可评估一个文档中任何字段的值。

评估操作符方法包括:

评估方法
matches
对字段值进行模运算产生指定结果的文档。
其值包含指定正则表达式的文档。
包含指定全文搜索表达式的文档。
包含指定 JavaScript 表达式的文档。

以下示例匹配 paint_purchases 集合中具有以字母“p”开头的 color 字段的文档:

Bson regexComparison = regex("color", "^p");
collection.find(regexComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 2, "color": "purple", "qty": 10, "vendor": ["C", "D"] }
{ "_id": 6, "color": "pink", "qty": 5, "vendor": ["C"] }

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

按位运算符方法包括:

按位法
matches
字段指定位已设置的文档(即为"1")。
字段指定位已清除的文档(即为"0")。
字段至少一个指定位已设置的文档(即为"1")。
字段中至少有一个指定位已清除的文档(即“0”)。

以下示例将匹配具有 bitField 字段且在相应位掩码“34”的位置设置了位的文档(即 “00100010”),且这些文档位于 binary_numbers 集合内:

Bson bitsComparison = bitsAllSet("a", 34);
collection.find(bitsComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 9, "a": 54, "binaryValue": "00110110" }
{ "_id": 12, "a": 102, "binaryValue": "01100110" }

地理空间操作符用于评估指定的坐标及其与形状或位置的关系。

地理空间操作符方法包括:

地理空间方法
matches
包含属于边界 GeoJSON 几何图形的 GeoJSON 几何图形值的文档。
包含指定框中存在的坐标值的文档。
包含指定多边形中存在的坐标值的文档。
包含存在于指定圆形内的坐标值的文档。
包含存在于指定圆形内的地理空间数据值(GeoJSON 或传统坐标对)的几何(使用球面几何)。
与 GeoJSON 几何图形相交的几何图形。2dsphere 索引支持 $geoIntersects
靠近某个点的地理空间对象。需要地理空间索引。2dsphere2d 索引支持 $near
靠近球面上某个点的地理空间对象。需要地理空间索引。2dsphere2d 索引支持 $nearSphere

以下示例创建了一个过滤器,该过滤器匹配 point 字段包含 GeoJSON 几何图形的文档,而该几何图形属于 geo_points 集合中给定的 多边形

Polygon square = new Polygon(Arrays.asList(new Position(0, 0),
new Position(4, 0),
new Position(4, 4),
new Position(0, 4),
new Position(0, 0)));
// Prints documents that contain "coordinates" values that are within the bounds of the polygon passed as the filter parameter
Bson geoWithinComparison = geoWithin("coordinates", square);
collection.find(geoWithinComparison).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述查询的输出:

{ "_id": 13, "coordinates": {"type": "Point", "coordinates": [2.0, 2.0]} }
{ "_id": 15, "coordinates": {"type": "Point", "coordinates": [1.0, 3.0]} }
← 聚合构建器