몽고DB 튜토리얼login
몽고DB 튜토리얼
작가:php.cn  업데이트 시간:2022-04-21 17:49:03

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를 매우 유연하고 강력하게 사용할 수 있습니다.

PHP 중국어 웹사이트