229.6. MongoDB Operations - producer 端点
229.6.1. 查询操作
229.6.1.1. findById
此操作从其 _id 字段与 IN 消息正文内容匹配的集合中检索一个元素。传入对象可以是对 Bson
类型相等的任何内容。请参阅 http://bsonspec.org//specification[http://bsonspec.org// specification] 和 http://www.mongodb.org/display/DOCS/Java+Types。
from("direct:findById") .to("mongodb3:myDb?database=flights&collection=tickets&operation=findById") .to("mock:resultFindById");
支持可选参数。此操作支持指定字段过滤器。请参阅 指定可选参数。
229.6.1.2. findOneByQuery
使用这个操作从与 MongoDB 查询匹配的集合中仅检索一个元素(第一个)。查询对象被提取为 CamelMongoDbCriteria
标头。如果 CamelMongoDbCriteria 标头为空,则会提取查询对象正文,例如: Bson
或将可转换为 Bson
。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换。您可以使用 MongoDB Driver 中的 Filters 类。
没有查询的示例(返回集合的任何对象):
from("direct:findOneByQuery") .to("mongodb3:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
带有查询的示例(返回一个匹配的结果):
from("direct:findOneByQuery") .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani")) .to("mongodb3:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
支持可选参数。此操作支持指定字段投射和/或排序子。请参阅 指定可选参数。
229.6.1.3. findAll
findAll
操作会返回与查询匹配的所有文档,或根本没有内容,在这种情况下,集合中包含的所有文档都会被返回。查询对象被提取为 CamelMongoDbCriteria
标头。如果 CamelMongoDbCriteria 标头为空,则会提取查询对象正文,例如: Bson
或将可转换为 Bson
。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换。
没有查询的示例(在集合中返回所有对象):
from("direct:findAll") .to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
带有查询的示例(返回所有匹配结果):
from("direct:findAll") .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani")) .to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
通过以下标头支持分页和高效的检索:
标头密钥 | 快速持续 | 描述(从 MongoDB API doc中提取) | 预期类型 |
---|---|---|---|
|
| 丢弃光标开头的给定数量元素。 | int/Integer |
|
| 限制返回的元素数量。 | int/Integer |
|
| 限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们存储在本地。如果 batchSize 为正数,代表检索对象的每个批处理的大小。可以调整它,以优化性能和限制数据传输。如果 batchSize 为负数,它将限制返回的数量对象,其适用于最大批处理大小限制(通常为 4MB),并且光标将被关闭。例如,如果 batchSize 是 -10,那么服务器会返回最多 10 个文档,并且与在 4MB 中可容纳的数目像 4MB 一样,然后关闭光标。请注意,这个功能与在最大大小的 limit ()中不同,它不需要发送请求以关闭光标服务器端。即使在迭代光标后,也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。 | int/Integer |
带有选项 outputType=MongoIterable 和 batch 大小示例:
from("direct:findAll") .setHeader(MongoDbConstants.BATCH_SIZE).constant(10) .setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani")) .to("mongodb3:myDb?database=flights&collection=tickets&operation=findAll&outputType=MongoIterable") .to("mock:resultFindAll");
findAll
操作也会返回以下 OUT 标头,以便在使用分页时迭代结果页面:
标头密钥 | 快速持续 | 描述(从 MongoDB API doc中提取) | 数据类型 |
---|---|---|---|
|
| 与查询匹配的对象数量。这不会考虑限制/跳过。 | int/Integer |
|
| 与查询匹配的对象数量。这不会考虑限制/跳过。 | int/Integer |
支持可选参数。此操作支持指定字段投射和/或排序子。请参阅 指定可选参数。
229.6.1.4. 数量
返回集合中对象总数,将 Long 返回为 OUT 消息正文。
以下示例将计算 "dynamicCollectionName" 中的记录数。请注意,动态程度如何启用动态,因此操作不会针对"可见的Scientists"集合运行,而是针对"dynamicCollectionName"集合运行。
// from("direct:count").to("mongodb3: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 标头为空,则查询对象是提取的消息正文,即: Bson
或将可转换为 Bson
。操作将返回匹配此条件的文档数量。
Document query = ... Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
229.6.1.5. 指定字段过滤器(项目)
默认情况下,查询操作将完全返回匹配的对象(包含所有字段)。如果您的文档庞大,且您只需要检索其字段的子集,只需在所有查询操作中指定字段过滤器,只需设置相关的
(或者键入可转换为 Bson,如 JSON String、Map 等)。Bson
以下是一个使用 MongoDB 投射来简化 Bson 的创建示例。它检索
_id
和 boringField
以外的所有字段:
// route: from("direct:findAll").to("mongodb3: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("mongodb3: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);
229.6.1.6. 指定 sort 子句
通常需要从集合中获取 min/max 记录,这基于使用 MongoDB 的 Sorts
对特定字段的排序来简化 Bson 的创建。它检索 _id
和 boringField
以外的所有字段:
// route: from("direct:findAll").to("mongodb3: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 查询)。本例演示了根据 documentTimestamp
字段从集合中获取最新文档并将结果减少到单个字段:
.from("direct:someTriggeringEvent") .setHeader(MongoDbConstants.SORT_BY).constant(Sorts.descending("documentTimestamp")) .setHeader(MongoDbConstants.FIELDS_PROJECTION).constant(Projection.include("documentTimestamp")) .setBody().constant("{}") .to("mongodb3:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery") .to("direct:aMyBatisParameterizedSelect") ;