MongoDB 맵 축소 기능


  번역 결과:

map

英[mæp] 美[mæp]

n. 지도, 천체 지도; <미국 속어> 얼굴, 유전자 지도

vt . 지도 그리기(지역 등), 세부 계획; ; 약화시키다

vi. 감소하다; (액체) 농축시키다

MongoDB 맵 축소 기능통사론

기능: Map-Reduce는 간단히 말해서 실행을 위해 대규모 작업(데이터)을 분해한 다음(MAP) 결과를 최종 결과(REDUCE)로 병합하는 컴퓨팅 모델입니다. MongoDB에서 제공하는 Map-Reduce는 매우 유연하고 대규모 데이터 분석에 매우 실용적입니다.

구문: ​​>db.collection.mapReduce( function() {emit(key,value);}, //map function
function(key,values) {return 감소Function}, //감소 함수 {out: collection, query: document, sort: document,limit: number }) MapReduce를 사용하여 Map 함수와 Reduce 함수라는 두 가지 함수를 구현합니다. Map 함수는 Emit(key, value)을 호출하고 컬렉션의 모든 레코드를 순회하며, 처리를 위해 키와 값을 Reduce 함수에 전달합니다. Map 함수는 키-값 쌍을 반환하기 위해 Emit(key, value)를 호출해야 합니다.

매개변수: map: 매핑 함수(축소 함수 매개변수로 일련의 키-값 쌍을 생성합니다). 통계 함수 감소에서 감소 함수의 작업은 키-값을 키-값으로 변환하는 것, 즉 값 배열을 단일 값 값으로 변환하는 것입니다. . out 통계 결과는 컬렉션에 저장됩니다(지정하지 않으면 임시 컬렉션이 사용되며 클라이언트 연결이 끊긴 후 자동으로 삭제됩니다). 쿼리는 필터링 조건입니다. 조건을 충족하는 문서만 지도 기능을 호출합니다. (쿼리, 제한 및 정렬은 마음대로 결합 가능) 정렬 및 제한(문서를 맵 기능으로 보내기 전에 문서 정렬)과 결합된 정렬 정렬 매개변수는 그룹화 메커니즘 제한을 최적화하고 개수의 상한을 제한할 수 있습니다. 지도 기능으로 전송된 문서의 개수(제한이 없으면 정렬만으로는 거의 쓸모가 없습니다)

MongoDB 맵 축소 기능예

>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 })
现在,我们将在 posts 集合中使用 mapReduce 函数来选取已发布的文章(status:"active"),并通过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
}
结果表明,共有4个符合查询条件(status:"active")的文档, 在map函数中生成了4个键值对文档,最后使用reduce函数将相同的键值分为两组。



具体参数说明:

result:储存结果的collection的名字,这是个临时集合,MapReduce的连接关闭后自动就被删除了。

timeMillis:执行花费的时间,毫秒为单位

input:满足条件被发送到map函数的文档个数

emit:在map函数中emit被调用的次数,也就是所有集合中的数据总量

ouput:结果集合中的文档个数(count对调试非常有帮助)

ok:是否成功,成功为1

err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

使用 find 操作符来查看 mapReduce 的查询结果:

>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的使用非常灵活和强大。

비디오

Q&A