1. 概述
本文将深入探讨如何使用 MongoDB Java 驱动中的 Filters 构建器来创建查询过滤器。Filters 是 MongoDB 用于根据特定条件筛选结果的核心工具,它提供了一套类型安全的 API 来构建 BSON 查询条件。
2. 构建器类型
MongoDB Java 驱动提供了多种构建器(Builders)来简化 BSON 文档的构造。这些构建器通过便捷的 API 大幅简化了 CRUD 操作和聚合管道的开发过程。主要构建器类型包括:
- ✅ Filters:构建查询条件
- ✅ Projections:定义字段投影(包含/排除)
- ✅ Sorts:构建排序规则
- ✅ Updates:构建更新操作
- ✅ Aggregates:构建聚合管道
- ✅ Indexes:构建索引键
接下来我们重点剖析 Filters 的各种使用场景。
3. 数据库初始化
为演示过滤器操作,首先创建测试数据库 baeldung
和集合 user
:
use baeldung;
db.createCollection("user");
插入测试数据:
db.user.insertMany([
{
"userId":"123",
"userName":"Jack",
"age":23,
"role":"Admin"
},
{
"userId":"456",
"userName":"Lisa",
"age":27,
"role":"Admin",
"type":"Web"
},
{
"userId":"789",
"userName":"Tim",
"age":31,
"role":"Analyst"
}]);
成功插入后返回确认结果:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("6357c4736c9084bcac72eced"),
ObjectId("6357c4736c9084bcac72ecee"),
ObjectId("6357c4736c9084bcac72ecef")
]
}
后续所有示例都将基于此集合进行演示。
4. 使用 Filters 类
Filters 本质是 MongoDB 用来限制结果集的条件操作。Filters 类提供了大量静态工厂方法,每个方法返回 BSON 类型对象,可直接传递给需要查询过滤器的 API。
⚠️ 注意:当前 Java 驱动中的 Filters 类已取代旧版 API 的 QueryBuilder。
Filters 按操作类型分为:条件操作、逻辑操作、数组操作、元素操作、评估操作、位操作和地理空间操作。下面介绍最常用的几种方法:
4.1. eq() 方法
Filters.eq() 创建精确匹配过滤器,筛选字段值等于指定值的文档。
MongoDB Shell 查询示例(查找 userName 为 "Jack" 的文档):
db.getCollection('user').find({"userName":"Jack"})
返回结果:
{
"_id" : ObjectId("6357c4736c9084bcac72eced"),
"userId" : "123",
"userName" : "Jack",
"age" : 23.0,
"role" : "Admin"
}
对应的 Java 驱动实现:
Bson filter = Filters.eq("userName", "Jack");
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
反向操作:Filters.ne()
匹配字段值不等于指定值的文档:
Bson filter = Filters.ne("userName", "Jack");
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
4.2. gt() 方法
Filters.gt() 创建大于过滤器,筛选字段值大于指定值的文档:
Bson filter = Filters.gt("age", 25);
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
相关方法:
Filters.lt()
:小于Filters.gte()
:大于等于Filters.lte()
:小于等于
小于操作示例:
Bson filter = Filters.lt("age", 25);
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
4.3. in() 方法
Filters.in() 创建多值匹配过滤器,筛选字段值在指定列表中的文档:
Bson filter = Filters.in("userName", "Jack", "Lisa");
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
反向操作:Filters.nin()
匹配字段值不在指定列表中的文档:
Bson filter = Filters.nin("userName", "Jack", "Lisa");
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
4.4. and() 方法
Filters.and() 创建逻辑与过滤器,组合多个条件(需全部满足):
Bson filter = Filters.and(Filters.gt("age", 25), Filters.eq("role", "Admin"));
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
4.5. or() 方法
Filters.or() 创建逻辑或过滤器,组合多个条件(满足其一即可):
Bson filter = Filters.or(Filters.gt("age", 30), Filters.eq("role", "Admin"));
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
4.6. exists() 方法
Filters.exists() 创建字段存在性过滤器,筛选包含指定字段的文档:
Bson filter = Filters.exists("type");
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
4.7. regex() 方法
Filters.regex() 创建正则匹配过滤器,筛选字段值匹配正则表达式的文档:
Bson filter = Filters.regex("userName", "a");
FindIterable<Document> documents = collection.find(filter);
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
5. 总结
本文系统介绍了 MongoDB Java 驱动中 Filters 构建器的核心用法,包括:
- 精确匹配(eq/ne)
- 范围比较(gt/lt/gte/lte)
- 多值匹配(in/nin)
- 逻辑组合(and/or)
- 字段存在性(exists)
- 正则匹配(regex)
这些过滤器不仅可用于 find()
查询,还能应用于聚合管道的 $match
阶段、deleteOne()
、updateOne()
等多种场景。灵活组合这些过滤器能高效实现复杂查询需求。
完整示例代码请查阅 GitHub 仓库。