筛选构建器
Overview
在本指南中,您可以了解如何使用构建器为 MongoDB Java 驱动程序中的查询指定筛选器。
构建器是 MongoDB Java 驱动程序提供的类,可帮助您构造 BSON 对象。要了解详情,请参阅我们的构建器指南。
过滤器是 MongoDB 用于将结果限制为您想要查看的内容的操作。
我们使用筛选器的一些地方是:
find()
聚合的匹配阶段
deleteOne()
/deleteMany()
updateOne()
/updateMany()
使用筛选器的查询结果的部分示例如下:
价格为 0 至 25 美元的商品
其设施包括室内游泳池和免费停车场的一家酒店
一篇提到 "spicy" 的美食评论家评论
本指南通过以下类型的操作符示例向您展示如何使用构建者:
Filters
类为所有 MongoDB 查询操作符提供静态工厂方法。每个方法都返回一个 BSON 类型的实例,您可以将其传递给任何需要查询筛选器的方法。
提示
本指南中的筛选器示例使用以下样本集合:
集合: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 |
---|---|
等于指定值的值。 | |
值大于指定值。 | |
值小于或等于指定值。 | |
值小于指定的值。 | |
值小于或等于指定的值。 | |
值不等于指定的值。 | |
数组中指定的任何值。 | |
没有数组中指定的值。 | |
所有文档。 |
以下示例创建一个筛选器,用于匹配 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 |
---|---|
具有所有筛选器条件的文档。此运算符使用逻辑 | |
具有任一筛选器条件的文档。此操作符使用逻辑 | |
不符合筛选条件的文档。 | |
无法匹配两个筛选器的文档。此运算符使用逻辑 |
以下示例创建一个筛选器,用于匹配 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"] }
元素
元素运算符会计算指定字段的性质。
元素操作符方法包括:
以下示例匹配具有 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"] }
Bitwise
按位操作符将数字转换为其二进制值,以计算其位。
按位运算符方法包括:
按位法 | 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 几何图形相交的几何图形。 | |
靠近某个点的地理空间对象。需要地理空间索引。 | |
靠近球面上某个点的地理空间对象。需要地理空间索引。 |
以下示例创建了一个过滤器,该过滤器匹配 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]} }