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에서 추출)예상 유형

CamelMongoDbNumToSkip

MongoDbConstants.NUM_TO_SKIP

커서가 시작될 때 지정된 수의 요소를 삭제합니다.

int/Integer

CamelMongoDbLimit

MongoDbConstants.LIMIT

반환된 요소 수를 제한합니다.

int/Integer

CamelMongoDbBatchSize

MongoDbConstants.BATCH_SIZE

하나의 일괄 처리에서 반환된 요소 수를 제한합니다. 커서는 일반적으로 결과 오브젝트의 배치를 가져와 로컬에 저장합니다. 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에서 추출)데이터 유형

CamelMongoDbResultTotalSize

MongoDbConstants.RESULT_TOTAL_SIZE

쿼리와 일치하는 오브젝트 수입니다. 이는 limit/skip를 고려하지 않습니다.

int/Integer

CamelMongoDbResultPageSize

MongoDbConstants.RESULT_PAGE_SIZE

쿼리와 일치하는 오브젝트 수입니다. 이는 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. 필드 필터(프로젝션) 지정

기본적으로 쿼리 작업은 일치하는 오브젝트 전체를 반환합니다(모든 필드 포함). 문서가 크고 해당 필드의 하위 집합만 검색해야 하는 경우 모든 쿼리 작업에서 필드 필터를 지정할 수 있습니다. 즉, 관련 DBObject (또는 JSON String, Map 등)로 변환할 수 있습니다. 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")
;