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 仓库


原始标题:Guide to Filters in MongoDB | Baeldung