34.7. MongoDB 操作 - producer 端点


34.7.1. 查询操作

34.7.1.1. findById

此操作只从 _id 字段的集合中检索一个元素,该元素与 IN 消息正文的内容匹配。传入对象可以是等同于 Bson 类型的任何对象。请参阅 http://bsonspec.org/spec.htmlhttp://www.mongodb.org/display/DOCS/Java+Types

from("direct:findById")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
    .to("mock:resultFindById");
Copy to Clipboard Toggle word wrap

请注意,默认的 _id 由 Mongo 和 ObjectId 类型处理,因此您可能需要正确转换。

from("direct:findById")
    .convertBodyTo(ObjectId.class)
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
    .to("mock:resultFindById");
Copy to Clipboard Toggle word wrap
注意

支持可选参数
此操作支持预测操作器。请参阅 指定字段过滤器(项目)

34.7.1.2. findOneByQuery

从与 MongoDB 查询选择器匹配的集合中检索第一个元素。如果设置了 CamelMongoDbCriteria 标头,则其值将用作查询选择器。如果 CamelMongoDbCriteria 标头为 null,则使用 IN 消息正文作为查询选择器。在这两种情况下,查询选择器应当是 Bson 类型或可转换 Bson (例如,JSON 字符串或 HashMap)。如需更多信息,请参阅类型转换。

使用 MongoDB 驱动程序提供的 Filters 创建查询选择器。

from("direct:findOneByQuery")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
    .to("mock:resultFindOneByQuery");
Copy to Clipboard Toggle word wrap
from("direct:findOneByQuery")
    .setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani")))
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
    .to("mock:resultFindOneByQuery");
Copy to Clipboard Toggle word wrap
注意

支持可选参数
此操作支持预测运算符和排序子句。请参阅 指定字段过滤器(projection),指定 sort 子句。

34.7.1.5. findAll

findAll 操作会返回与查询匹配或 none 的所有文档,在这种情况下,当集合中包含的所有文档都会被返回。query 对象提取 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头为 null,则查询对象正在提取消息正文,即它应当键入 Bson 或转换为 Bson。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅类型转换。

from("direct:findAll")
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
    .to("mock:resultFindAll");
Copy to Clipboard Toggle word wrap
from("direct:findAll")
    .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani"))
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
    .to("mock:resultFindAll");
Copy to Clipboard Toggle word wrap

以下标头支持分页和有效的检索:

Expand
标头密钥快速持续描述(从 MongoDB API doc中提取)预期类型

CamelMongoDbNumToSkip

MongoDbConstants.NUM_TO_SKIP

在光标的开头丢弃指定数量的元素。

int/Integer

CamelMongoDbLimit

MongoDbConstants.LIMIT

限制返回的元素数量。

int/Integer

CamelMongoDbBatchSize

MongoDbConstants.BATCH_SIZE

限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们保存到本地。如果 batchSize 是正数的,它代表检索的每个批处理对象的大小。可以调整它以优化性能和限制数据传输。如果 batchSize 为负数,它将限制返回的数字对象,这适用于最大批处理大小限制(通常为 4MB),光标将被关闭。例如,如果 batchSize 是 -10,则服务器将返回最多 10 个文档,并且尽可能多地在 4MB 中容纳,然后关闭光标。请注意,这个功能与文档中的 limit()不同,该文档必须在最大大小内容纳,它不再需要发送请求以关闭光标服务器。即使要迭代光标,也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。

int/Integer

CamelMongoDbAllowDiskUse

MongoDbConstants.ALLOW_DISK_USE

设置 allowDiskUse MongoDB 标记。从 MongoDB Server 4.3.1 开始支持。将这个标头与旧的 MongoDB Server 版本一起使用可能会导致查询失败。

boolean/Boolean

from("direct:findAll")
    .setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
    .setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani")))
    .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=MongoIterable")
    .to("mock:resultFindAll");
Copy to Clipboard Toggle word wrap

findAll 操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:

Expand
标头密钥快速持续描述(从 MongoDB API doc中提取)数据类型

CamelMongoDbResultTotalSize

MongoDbConstants.RESULT_TOTAL_SIZE

与查询匹配的对象数。这不会考虑 limit/skip。

int/Integer

CamelMongoDbResultPageSize

MongoDbConstants.RESULT_PAGE_SIZE

与查询匹配的对象数。这不会考虑 limit/skip。

int/Integer

注意

支持可选参数
此操作支持预测运算符和排序子句。请参阅 指定字段过滤器(projection),指定 sort 子句。

34.7.1.6. 数量

返回集合中对象总数,返回 OUT 邮件正文。
以下示例将计算"dynamicCollectionName"集合中的记录数。请注意如何启用动态性,因此操作不会针对"明确的家"集合运行,而是针对"dynamicCollectionName"集合来运行。

// from("direct:count").to("mongodb:myDb?database=tickets&collection=flights&operation=count&dynamicity=true");
Long result = template.requestBodyAndHeader("direct:count", "irrelevantBody", MongoDbConstants.COLLECTION, "dynamicCollectionName");
assertTrue("Result is not of type Long", result instanceof Long);
Copy to Clipboard Toggle word wrap

您可以提供一个 查询的查询对象来提取 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头为 null,查询对象会提取消息正文,即它应当是 Bson 类型或转换为 Bson

Document query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
Copy to Clipboard Toggle word wrap

34.7.1.7. 指定字段过滤器(项目)

默认情况下,查询操作将全部返回匹配对象(含有所有字段)。如果您的文档较大,且您只需要检索其字段的子集,您可以在所有查询操作中指定字段过滤器,只需设置相关的 Bson (或类型转换为 Bson),如 CamelMongoDbFieldsProjection 标头上的 JSON String、Map 等。

下面是一个示例,它使用 MongoDB 的投射来简化 Bson 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
Copy to Clipboard Toggle word wrap

下面是一个示例,它使用 MongoDB 的投射来简化 Bson 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
Copy to Clipboard Toggle word wrap

34.7.1.8. 指定 sort 子句

通常需要根据特定字段排序从集合中获取 min/max 记录,以使用 MongoDB 的 Sorts 简化 Bson 的创建。它检索 _idboringField 以外的所有字段:

// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson sorts = Sorts.descending("_id");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.SORT_BY, sorts);
Copy to Clipboard Toggle word wrap

在 Camel 路由中,SORT_BY 标头可与 findOneByQuery 操作一起使用,以获得相同的结果。如果还指定了 FIELDS_PROJECTION 标头,操作会返回单个字段/值对,可以直接传递给另一组件(例如,参数化 MyBatis SELECT 查询)。本例演示了根据文档 Timestamp 字段从集合中获取最新文档,并将结果减少到单个字段:

.from("direct:someTriggeringEvent")
.setHeader(MongoDbConstants.SORT_BY).constant(Sorts.descending("documentTimestamp"))
.setHeader(MongoDbConstants.FIELDS_PROJECTION).constant(Projection.include("documentTimestamp"))
.setBody().constant("{}")
.to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery")
.to("direct:aMyBatisParameterizedSelect");
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat