MongoDB 맵 축소
Map-Reduce는 간단히 말해서 실행을 위해 대규모 작업(데이터)을 분해한 다음(MAP) 그 결과를 최종 결과(REDUCE)로 병합하는 컴퓨팅 모델입니다.
MongoDB에서 제공하는 Map-Reduce는 매우 유연하고 대규모 데이터 분석에 매우 실용적입니다.
MapReduce 명령
MapReduce의 기본 구문은 다음과 같습니다.
>db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } )
MapReduce를 사용하여 두 가지 함수 구현 Map 함수 그리고 Reduce 함수, Map 함수 호출은 Emit(key, value), 컬렉션의 모든 레코드를 탐색하고 처리를 위해 키와 값을 Reduce 함수에 전달합니다.
Map 함수는 Emit(key, value)를 호출하여 키-값 쌍을 반환해야 합니다.
매개변수 설명:
map: 매핑 함수(축소 함수 매개변수로 일련의 키-값 쌍을 생성합니다).
reduce 통계 함수, 감소 함수의 작업은 키-값을 키-값으로 바꾸는 것, 즉 값을 바꾸는 것입니다. 단일 값 값으로 배열합니다. .
out 통계 결과 저장 컬렉션(지정하지 않을 경우 임시 컬렉션을 사용하며, 클라이언트 연결이 끊긴 후 자동으로 삭제됩니다.)
query 필터 조건입니다. 조건에 맞는 문서만 맵 기능을 호출합니다. (query.limit, sort는 임의로 조합 가능)
sort Limit과 결합된 sort 정렬 매개변수 (지도 기능으로 보내기 전에 문서도 정렬함) , 그룹화 메커니즘을 최적화할 수 있습니다
limit 맵 기능으로 전송되는 문서 수의 상한(제한이 없는 경우 정렬만 사용하는 것은 거의 사용되지 않음)
MapReduce 사용
사용자의 기사를 저장하려면 다음 문서 구조를 고려하세요. 문서는 사용자의 user_name과 상태 필드를 저장합니다. 기사:
>db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "php中文网,最全的技术文档。", "user_name": "php", "status":"active" }) WriteResult({ "nInserted" : 1 })
이제 게시물 컬렉션의 mapReduce 함수를 사용하여 게시된 기사(상태: "활성")를 선택하고 이를 user_name별로 그룹화한 후 각 사용자의 기사 수를 계산합니다.
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
위의 mapReduce 출력 결과는 다음과 같습니다.
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
결과는 쿼리 조건(상태: "active")을 충족하는 문서가 4개 있음을 보여줍니다. map 함수에서 4개의 키-값 쌍 문서가 생성되고, 마지막으로 축소 함수를 사용하여 동일한 키 값을 두 그룹으로 나눕니다.
특정 매개변수 설명:
result: 결과를 저장하는 컬렉션 이름입니다. MapReduce 연결이 종료되었습니다. 자동으로 삭제됩니다.
timeMillis: 실행하는 데 걸리는 시간(밀리초)
input: 조건을 충족하고 지도 함수
emit: 지도 함수에서 내보내기가 호출된 횟수, 이는 모든 컬렉션의 총 데이터 양
ouput: 결과 컬렉션의 문서 수 Count (count는 디버깅에 매우 유용합니다)
ok: 성공하면 성공입니다. 1
-
err: 실패하면 여기에 실패 이유가 있을 수 있지만 경험상 그 이유가 모호하고 거의 쓸모가 없습니다
mapReduce 쿼리 결과를 보려면 find 연산자를 사용하십시오.
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
위 쿼리는 두 명의 사용자 tom과 mark가 두 개의 기사를 게시한 결과를 표시합니다.
{ "_id" : "mark", "value" : 4 } { "_id" : "php", "value" : 1 }
마찬가지로 MapReduce를 사용하여 크고 복잡한 집계 쿼리를 작성할 수 있습니다.
Map 함수와 Reduce 함수는 JavaScript를 사용하여 구현할 수 있으므로 MapReduce를 매우 유연하고 강력하게 사용할 수 있습니다.