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");
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");
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");
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");
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");
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");
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");
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);
// 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");
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);
// 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);
// 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);
// 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 字段从集合中获取最新文档,并将结果减少到单个字段: