38.7. MongoDB 操作 - 制作者端点
38.7.1. 查询操作 复制链接链接已复制到粘贴板!
38.7.1.1. findById 复制链接链接已复制到粘贴板!
此操作仅检索一个元素,其 _id 字段与 IN 消息正文的内容匹配。incoming 对象可以是等同于 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");
支持可选参数
。此操作支持投射操作器。请参阅 指定字段过滤器(项目 )。
38.7.1.2. findOneByQuery 复制链接链接已复制到粘贴板!
从与 MongoDB 查询选择器匹配的集合中检索第一个元素。如果设置了 CamelMongoDbCriteria 标头,则其值将用作查询选择器。如果 CamelMongoDbCriteria 标头为 null,则将使用 IN 消息正文作为查询选择器。在这两种情况下,查询选择器都应是 Bson 类型,或转换为 Bson (例如,JSON 字符串或 HashMap)。如需更多信息,请参阅类型转换。
使用 MongoDB 驱动程序提供的 过滤器 创建查询选择器。
38.7.1.3. 没有查询选择器的示例(返回集合中的第一个文档) 复制链接链接已复制到粘贴板!
from("direct:findOneByQuery")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
38.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");
支持可选参数
。此操作支持预测运算符和排序条款。请参阅 指定字段过滤器(项目),指定 sort 子句。
38.7.1.5. findAll 复制链接链接已复制到粘贴板!
findAll 操作会返回与查询匹配的所有文档,或根本不返回所有文档,在这种情况下,返回集合中包含的所有文档。query 对象会被提取 CamelMongoDbCriteria 标头。如果 CamelMongoDbCriteria 标头是 null,查询对象是提取的消息正文,即:它应当是 Bson 类型,或转换为 Bson。它可以是 JSON 字符串或哈希映射。如需更多信息,请参阅类型转换。
38.7.1.5.1. 没有查询选择器的示例(重新返回集合中的所有文档) 复制链接链接已复制到粘贴板!
from("direct:findAll")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
38.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 文档中提取) | 预期类型 |
|---|---|---|---|
|
|
| 在光标的开头丢弃给定数量元素。 | int/Integer |
|
|
| 限制返回的元素数量。 | int/Integer |
|
|
| 限制一个批处理中返回的元素数量。光标通常获取结果对象的批处理,并将它们存储在本地。如果 batchSize 为正数,它代表检索的每个对象批处理的大小。可以对其进行调整以优化性能并限制数据传输。如果 batchSize 为负数,它将限制返回的对象数量,该数量适合最大批处理大小限制(通常为 4MB),光标将被关闭。例如,如果 batchSize 是 -10,则服务器会返回最多 10 个文档,并且尽可能在 4MB 中容纳,然后关闭光标。请注意,此功能与文档中必须适合最大大小的 limit ()不同,并且无需发送请求以关闭光标服务器端。即使在光标迭代后也可以更改批处理大小,在这种情况下,设置将应用到下一个批处理检索。 | int/Integer |
|
|
| 设置 allowDiskUse MongoDB 标志。从 MongoDB Server 4.3.1 开始,支持它。将此标头与旧的 MongoDB 服务器版本搭配使用可能会导致查询失败。 | 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");
findAll 操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:
| 标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 数据类型 |
|---|---|---|---|
|
|
| 与查询匹配的对象数量。这不会考虑 limit/skip。 | int/Integer |
|
|
| 与查询匹配的对象数量。这不会考虑 limit/skip。 | int/Integer |
支持可选参数
。此操作支持预测运算符和排序条款。请参阅 指定字段过滤器(项目),指定 sort 子句。
38.7.1.6. 数量 复制链接链接已复制到粘贴板!
返回集合中对象总数,返回 Long 作为 OUT 消息正文。
以下示例将计算"dynamicCollectionName"集合中的记录数。请注意如何启用动态性,因此操作不会针对 "notableScientists" 集合运行,而是针对 "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");
38.7.1.7. 指定字段过滤器(投射) 复制链接链接已复制到粘贴板!
默认情况下,查询操作将返回其整个匹配对象(及其所有字段)。如果您的文档比较大,且您只需要检索其字段子集,您可以在所有查询操作中指定字段过滤器,只需通过设置相关的 Bson (或类型转换为 Bson,如 JSON 字符串、映射等)在 CamelMongoDbFieldsProjection 标头、恒定快捷键上指定字段过滤器:Mongo DbConstants.FIELDS_PROJECTION。
以下是使用 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);
38.7.1.8. 指定 sort 子句 复制链接链接已复制到粘贴板!
通常,需要从集合中获取 min/max 记录,它根据使用 MongoDB 的 Sorts 的特定字段排序来获取 min/max 记录来简化 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 查询)的单个字段/值对。本例演示了根据 documentTimestamp 字段从集合中获取最新文档,并将结果减少到单个字段:
.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");