228.6. MongoDB 操作 - producer 端点
228.6.1. 查询操作 复制链接链接已复制到粘贴板!
228.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("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");
支持可选参数。此操作支持指定字段过滤器。请参阅 指定可选参数。
228.6.1.2. findOneByQuery 复制链接链接已复制到粘贴板!
使用此操作从与 MongoDB 查询匹配的集合中检索一个元素。查询对象从 IN 消息正文中提取,即,它的类型应该是 DBObject
的类型,或者转换为 DBObject
。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换。
没有查询的示例(返回集合的任何对象):
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");
带有查询的示例(返回一个匹配的结果):
from("direct:findOneByQuery") .setBody().constant("{ \"name\": \"Raul Kripalani\" }") .to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery") .to("mock:resultFindOneByQuery");
from("direct:findOneByQuery")
.setBody().constant("{ \"name\": \"Raul Kripalani\" }")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
支持可选参数。此操作支持指定字段过滤器和/或排序子。请参阅 指定可选参数。
228.6.1.3. findAll 复制链接链接已复制到粘贴板!
findAll
操作会返回与查询匹配或 none 的所有文档,在这种情况下,当集合中包含的所有文档都会被返回。查询对象从 IN 消息正文中提取,即,它的类型应该是 DBObject
的类型,或者转换为 DBObject
。它可以是 JSON String 或 Hashmap。如需更多信息,请参阅 #Type 转换。
没有查询的示例(在集合中返回所有对象):
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");
带有查询的示例(返回所有匹配结果):
from("direct:findAll") .setBody().constant("{ \"name\": \"Raul Kripalani\" }") .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") .to("mock:resultFindAll");
from("direct:findAll")
.setBody().constant("{ \"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 |
您还可以通过包含 outputType=DBCursor (Camel 2.16+)作为 endpoint 选项,从服务器返回至您的路由的文档可能比设置上述标头更简单。这个 Exchange the DBCursor 来自 Mongo 驱动程序,就如同是在 Mongo shell 中执行 findAll ()一样,允许您的路由迭代结果。默认情况下,如果不使用此选项,此组件会将驱动程序的光标中的文档加载到列表,并将此数据返回到您的路由 - 这可能导致大量内存对象。请记住,使用 DBCursor 并不要求提供匹配的文档数量 - 请参阅 MongoDB 文档网站了解详细信息。
带有选项 outputType=DBCursor 和批处理大小 的示例:
from("direct:findAll") .setHeader(MongoDbConstants.BATCH_SIZE).constant(10) .setBody().constant("{ \"name\": \"Raul Kripalani\" }") .to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=DBCursor") .to("mock:resultFindAll");
from("direct:findAll")
.setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
.setBody().constant("{ \"name\": \"Raul Kripalani\" }")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=DBCursor")
.to("mock:resultFindAll");
findAll
操作还会返回以下 OUT 标头,以便在使用分页时迭代结果页面:
标头密钥 | 快速持续 | 描述(从 MongoDB API doc中提取) | 数据类型 |
---|---|---|---|
|
| 与查询匹配的对象数。这不会考虑 limit/skip。 | int/Integer |
|
| 与查询匹配的对象数。这不会考虑 limit/skip。 | int/Integer |
支持可选参数。此操作支持指定字段过滤器和/或排序子。请参阅 指定可选参数。
228.6.1.4. 数量 复制链接链接已复制到粘贴板!
返回集合中对象总数,返回 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);
// 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);
从 Camel 2.14 开始,您可以提供消息正文中的 com.mongodb.DBObject
对象作为查询,操作会返回与此条件匹配的文档量。
DBObject query = ... Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
DBObject query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
228.6.1.5. 指定字段过滤器(项目) 复制链接链接已复制到粘贴板!
默认情况下,查询操作将全部返回匹配对象(含有所有字段)。如果您的文档庞大,且您只需要检索其字段的子集,只需在所有查询操作中指定字段过滤器,只需设置相关的 DBObject
(或者类型可以转换为 DBObject
,如 JSON String、Map 等)在 CamelMongoDbFieldsFilter
标头上指定字段过滤器,持续快捷键:Mon DConstants.FIELDS_FILTER
。
下面是一个示例,它使用 MongoDB 的 BasicDBObjectBuilder 来简化 DBObject 的创建。它检索 _id
和 boringField
以外的所有字段:
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll") DBObject fieldFilter = BasicDBObjectBuilder.start().add("_id", 0).add("boringField", 0).get(); Object result = template.requestBodyAndHeader("direct:findAll", (Object) null, MongoDbConstants.FIELDS_FILTER, fieldFilter);
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
DBObject fieldFilter = BasicDBObjectBuilder.start().add("_id", 0).add("boringField", 0).get();
Object result = template.requestBodyAndHeader("direct:findAll", (Object) null, MongoDbConstants.FIELDS_FILTER, fieldFilter);
228.6.1.6. 指定 sort 子句 复制链接链接已复制到粘贴板!
通常需要根据特定字段排序从集合中获取 min/max 记录。在 Mongo 中,操作是使用类似如下的语法执行的:
db.collection.find().sort({_id: -1}).limit(1) // or db.collection.findOne({$query:{},$orderby:{_id:-1}})
db.collection.find().sort({_id: -1}).limit(1)
// or
db.collection.findOne({$query:{},$orderby:{_id:-1}})
在 Camel 路由中,SORT_BY 标头可与 findOneByQuery 操作一起使用,以获得相同的结果。如果还指定 FIELDS_FILTER 标头,其操作会返回可直接传递给另一个组件的单个字段/值对(例如,参数化 MyBatis SELECT 查询)。本例演示了根据文档 Timestamp 字段从集合中获取最新文档
,并将结果减少到单个字段: