227.6. MongoDB 작업 - 생산자 끝점
227.6.1. 쿼리 작업
227.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");
선택적 매개 변수를 지원합니다. 이 작업은 필드 필터 지정을 지원합니다. 선택적 매개변수 지정을 참조하십시오.
227.6.1.2. findOneByQuery
이 작업을 사용하여 MongoDB 쿼리와 일치하는 컬렉션에서 하나의 요소만 검색합니다. 쿼리 오브젝트는 IN 메시지 본문 (예: DBObject
) 유형 또는 DBObject
로 변환할 수 있어야 합니다. JSON 문자열 또는 Hashmap일 수 있습니다. 자세한 내용은 #Type 변환 에서 참조하십시오.
쿼리가 없는 예제( 컬렉션의 오브젝트를 반환함):
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");
선택적 매개 변수를 지원합니다. 이 작업은 필드 필터 및/또는 정렬 절을 지정하는 것을 지원합니다. 선택적 매개변수 지정을 참조하십시오.
227.6.1.3. findAll
findAll
작업은 쿼리와 일치하는 모든 문서를 반환하거나 전혀 없는 경우 컬렉션에 포함된 모든 문서가 반환됩니다. 쿼리 오브젝트는 IN 메시지 본문 (예: DBObject
) 유형 또는 DBObject
로 변환할 수 있어야 합니다. JSON 문자열 또는 Hashmap일 수 있습니다. 자세한 내용은 #Type 변환 에서 참조하십시오.
쿼리가 없는 예제(컬렉션의 모든 개체를 반환함):
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");
다음 헤더를 통해 페이징 및 효율적인 검색이 지원됩니다.
헤더 키 | 빠른 일정 | description (MongoDB API doc에서 추출) | 예상 유형 |
---|---|---|---|
|
| 커서가 시작될 때 지정된 수의 요소를 삭제합니다. | int/Integer |
|
| 반환된 요소 수를 제한합니다. | int/Integer |
|
| 하나의 일괄 처리에서 반환된 요소 수를 제한합니다. 커서는 일반적으로 결과 오브젝트의 배치를 가져와 로컬에 저장합니다. batchSize가 양수인 경우 검색된 각 개체의 크기를 나타냅니다. 성능을 최적화하고 데이터 전송을 제한하도록 조정할 수 있습니다. batchSize가 음수인 경우 최대 배치 크기 제한(일반적으로 4MB)에 맞는 숫자 개체가 제한되고 커서는 닫힙니다. 예를 들어 batchSize가 -10이면 서버는 최대 10개의 문서를 반환하고 4MB에 들어갈 수 있는 만큼의 문서를 반환하고 커서를 닫습니다. 이 기능은 문서가 최대 크기에 적합해야 한다는 점에서 limit()과 다르며 커서 서버 측을 닫기 위해 요청을 보낼 필요가 없습니다. 배치 크기는 커서를 반복한 후에도 변경할 수 있습니다. 이 경우 다음 배치 검색에 설정이 적용됩니다. | int/Integer |
또한 outputType=DBCursor (Camel 2.16+)를 위의 헤더를 설정하는 것보다 더 간단할 수 있는 엔드포인트 옵션으로 서버에서 반환한 문서를 경로에 "스트림"할 수 있습니다. 이렇게 하면 Mongo 쉘 내에서 findAll()를 실행하는 것처럼 Mongo 드라이버에서 DBCursor를 내보내어 경로를 결과를 반복할 수 있습니다. 기본적으로 이 구성 요소에서는 드라이버의 커서에서 문서를 목록으로 로드하고 이를 경로로 반환하므로 메모리 내 개체가 많은 수가 발생할 수 있습니다. 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");
또한 findAll
작업은 다음 OUT 헤더를 반환하여 페이징을 사용하는 경우 결과 페이지를 반복할 수 있습니다.
헤더 키 | 빠른 일정 | description (MongoDB API doc에서 추출) | 데이터 유형 |
---|---|---|---|
|
| 쿼리와 일치하는 오브젝트 수입니다. 이는 limit/skip를 고려하지 않습니다. | int/Integer |
|
| 쿼리와 일치하는 오브젝트 수입니다. 이는 limit/skip를 고려하지 않습니다. | int/Integer |
선택적 매개 변수를 지원합니다. 이 작업은 필드 필터 및/또는 정렬 절을 지정하는 것을 지원합니다. 선택적 매개변수 지정을 참조하십시오.
227.6.1.4. count
컬렉션의 총 개체 수를 반환하여 OUT 메시지 본문으로 long을 반환합니다.
다음 예제에서는 "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);
Camel 2.14 에서 메시지 본문에 com.mongodb.DBObject
오브젝트를 쿼리로 제공할 수 있으며 작업은 이 기준에 맞는 문서 양을 반환합니다.
DBObject query = ... Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
227.6.1.5. 필드 필터(프로젝션) 지정
기본적으로 쿼리 작업은 일치하는 오브젝트 전체를 반환합니다(모든 필드 포함). 문서가 크고 해당 필드의 하위 집합만 검색해야 하는 경우 모든 쿼리 작업에서 필드 필터를 지정할 수 있습니다. 즉, 관련
(또는 JSON String, Map 등)로 변환할 수 있습니다. DBObject
CamelMongoDbFieldsFilter
헤더, 연속 바로 가기: MongoDbConstants.FIDS_FIDS_FI
ER.
다음은 MongoDB의 BasicDBObjectBuilder를 사용하여 DBObject 생성을 단순화하는 예입니다. _id
및ted Field를 제외한 모든 필드를
검색합니다.
// 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);
227.6.1.6. 정렬 절 지정
특정 필드의 정렬에 따라 컬렉션에서 min/max 레코드를 가져와야 하는 경우가 많습니다. Mongo에서 작업은 다음과 유사한 구문을 사용하여 수행됩니다.
db.collection.find().sort({_id: -1}).limit(1) // or db.collection.findOne({$query:{},$orderby:{_id:-1}})
Camel 경로에서 SORT_BY 헤더를 findOneByQuery 작업과 함께 사용하여 동일한 결과를 얻을 수 있습니다. FIELDS_FILTER 헤더가 지정된 경우 작업은 다른 구성 요소(예: 매개 변수가 있는 MyBatis SELECT 쿼리)로 직접 전달할 수 있는 단일 필드/값 쌍을 반환합니다. 이 예제에서는 documentTimestamp
필드를 기반으로 한 컬렉션에서 임시 문서를 가져와서 결과를 단일 필드로 줄이는 방법을 보여줍니다.
.from("direct:someTriggeringEvent") .setHeader(MongoDbConstants.SORT_BY).constant("{\"documentTimestamp\": -1}") .setHeader(MongoDbConstants.FIELDS_FILTER).constant("{\"documentTimestamp\": 1}") .setBody().constant("{}") .to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery") .to("direct:aMyBatisParameterizedSelect") ;