34.7. MongoDB 操作 - producer 端点
34.7.1. 查询操作
34.7.1.1. findById
此操作只从 _id 字段的集合中检索一个元素,该元素与 IN 消息正文的内容匹配。传入对象可以是等同于 Bson
类型的任何对象。请参阅 http://bsonspec.org/spec.html 和 http://www.mongodb.org/display/DOCS/Java+Types。
from("direct:findById") .to("mongodb:myDb?database=flights&collection=tickets&operation=findById") .to("mock:resultFindById");
请注意,默认的 _id 由 Mongo 和 ObjectId
类型处理,因此您可能需要正确转换。
from("direct:findById") .convertBodyTo(ObjectId.class) .to("mongodb:myDb?database=flights&collection=tickets&operation=findById") .to("mock:resultFindById");
支持可选参数
此操作支持预测操作器。请参阅 指定字段过滤器(项目)。
34.7.1.2. findOneByQuery
从与 MongoDB 查询选择器匹配的集合中检索第一个元素。如果设置了 CamelMongoDbCriteria
标头,则其值将用作查询选择器。如果 CamelMongoDbCriteria
标头为 null,则使用 IN 消息正文作为查询选择器。在这两种情况下,查询选择器应当是 Bson
类型或可转换 Bson
(例如,JSON 字符串或 HashMap
)。如需更多信息,请参阅类型转换。
使用 MongoDB 驱动程序提供的 Filters
创建查询选择器。
34.7.1.3. 没有查询选择器的示例(返回集合中的第一个文档)
from("direct:findOneByQuery") .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
34.7.1.4. 带有查询选择器的示例(返回集合中第一个匹配文档):
from("direct:findOneByQuery") .setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani"))) .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
支持可选参数
此操作支持预测运算符和排序子句。请参阅 指定字段过滤器(projection),指定 sort 子句。
34.7.1.5. findAll
findAll
操作会返回与查询匹配或 none 的所有文档,在这种情况下,当集合中包含的所有文档都会被返回。query 对象提取 CamelMongoDbCriteria
标头。如果 CamelMongoDbCriteria 标头为 null,则查询对象正在提取消息正文,即它应当键入 Bson
或转换为 Bson
。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅类型转换。
34.7.1.5.1. 没有查询选择器的示例(返回一个集合中的所有文档)
from("direct:findAll") .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
34.7.1.5.2. 带有查询选择器的示例(返回集合中所有匹配文档)
from("direct:findAll") .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani")) .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
以下标头支持分页和有效的检索:
标头密钥 | 快速持续 | 描述(从 MongoDB API doc中提取) | 预期类型 |
---|---|---|---|
|
| 在光标的开头丢弃指定数量的元素。 | int/Integer |
|
| 限制返回的元素数量。 | int/Integer |
|
| 限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们保存到本地。如果 batchSize 是正数的,它代表检索的每个批处理对象的大小。可以调整它以优化性能和限制数据传输。如果 batchSize 为负数,它将限制返回的数字对象,这适用于最大批处理大小限制(通常为 4MB),光标将被关闭。例如,如果 batchSize 是 -10,则服务器将返回最多 10 个文档,并且尽可能多地在 4MB 中容纳,然后关闭光标。请注意,这个功能与文档中的 limit()不同,该文档必须在最大大小内容纳,它不再需要发送请求以关闭光标服务器。即使要迭代光标,也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。 | int/Integer |
|
| 设置 allowDiskUse MongoDB 标记。从 MongoDB Server 4.3.1 开始支持。将这个标头与旧的 MongoDB Server 版本一起使用可能会导致查询失败。 | boolean/Boolean |
34.7.1.5.3. 带有 option outputType=MongoIterable 和 batch 大小的示例
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");
findAll
操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:
标头密钥 | 快速持续 | 描述(从 MongoDB API doc中提取) | 数据类型 |
---|---|---|---|
|
| 与查询匹配的对象数。这不会考虑 limit/skip。 | int/Integer |
|
| 与查询匹配的对象数。这不会考虑 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);
您可以提供一个 查询的查询对象来提取 CamelMongoDbCriteria
标头。如果 CamelMongoDbCriteria 标头为 null,查询对象会提取消息正文,即它应当是 Bson
类型或转换为 Bson
。
Document query = ... Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
34.7.1.7. 指定字段过滤器(项目)
默认情况下,查询操作将全部返回匹配对象(含有所有字段)。如果您的文档较大,且您只需要检索其字段的子集,您可以在所有查询操作中指定字段过滤器,只需设置相关的
(或类型转换为 Bson),如 Bson
CamelMongoDbFieldsProjection
标头上的 JSON String、Map 等。
下面是一个示例,它使用 MongoDB 的投射来简化 Bson 的创建。它检索
_id
和 boringField
以外的所有字段:
// 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);
下面是一个示例,它使用 MongoDB 的投射来简化 Bson 的创建。它检索
_id
和 boringField
以外的所有字段:
// 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);
34.7.1.8. 指定 sort 子句
通常需要根据特定字段排序从集合中获取 min/max 记录,以使用 MongoDB 的 Sorts
简化 Bson 的创建。它检索 _id
和 boringField
以外的所有字段:
// 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);
在 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");