
- MongoDB 教程
- MongoDB - 首頁
- MongoDB - 概述
- MongoDB - 優勢
- MongoDB - 環境搭建
- MongoDB - 資料建模
- MongoDB - 建立資料庫
- MongoDB - 刪除資料庫
- MongoDB - 建立集合
- MongoDB - 刪除集合
- MongoDB - 資料型別
- MongoDB - 插入文件
- MongoDB - 查詢文件
- MongoDB - 更新文件
- MongoDB - 刪除文件
- MongoDB - 投影
- MongoDB - 限制記錄
- MongoDB - 排序記錄
- MongoDB - 索引
- MongoDB - 聚合
- MongoDB - 複製
- MongoDB - 分片
- MongoDB - 建立備份
- MongoDB - 部署
- MongoDB - Java
- MongoDB - PHP
- 高階 MongoDB
- MongoDB - 關係
- MongoDB - 資料庫引用
- MongoDB - 覆蓋查詢
- MongoDB - 分析查詢
- MongoDB - 原子操作
- MongoDB - 高階索引
- MongoDB - 索引限制
- MongoDB - ObjectId
- MongoDB - MapReduce
- MongoDB - 文字搜尋
- MongoDB - 正則表示式
- 使用 Rockmongo
- MongoDB - GridFS
- MongoDB - 封頂集合
- 自動遞增序列
- MongoDB 有用資源
- MongoDB - 問答
- MongoDB - 快速指南
- MongoDB - 有用資源
- MongoDB - 討論
MongoDB - MapReduce
根據 MongoDB 文件,**Map-reduce** 是一種資料處理正規化,用於將大量資料壓縮成有用的聚合結果。MongoDB 使用 **mapReduce** 命令進行 map-reduce 操作。MapReduce 通常用於處理大型資料集。
MapReduce 命令
以下是基本 mapReduce 命令的語法:
>db.collection.mapReduce( function() {emit(key,value);}, //map function function(key,values) {return reduceFunction}, { //reduce function out: collection, query: document, sort: document, limit: number } )
map-reduce 函式首先查詢集合,然後將結果文件對映到發出鍵值對,然後根據具有多個值的鍵進行歸約。
在上述語法中:
**map** 是一個 JavaScript 函式,它將值與鍵對映併發出鍵值對
**reduce** 是一個 JavaScript 函式,它減少或分組所有具有相同鍵的文件
**out** 指定 map-reduce 查詢結果的位置
**query** 指定用於選擇文件的可選選擇條件
**sort** 指定可選的排序條件
**limit** 指定要返回的可選最大文件數
使用 MapReduce
考慮以下儲存使用者帖子的文件結構。文件儲存使用者的 user_name 和帖子的狀態。
{ "post_text": "tutorialspoint is an awesome website for tutorials", "user_name": "mark", "status":"active" }
現在,我們將對我們的 **posts** 集合使用 mapReduce 函式來選擇所有活動帖子,根據 user_name 對其進行分組,然後使用以下程式碼計算每個使用者的帖子數量:
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
上述 MapReduce 查詢輸出以下結果:
{ "result" : "post_total", "timeMillis" : 9, "counts" : { "input" : 4, "emit" : 4, "reduce" : 2, "output" : 2 }, "ok" : 1, }
結果顯示共有 4 個文件匹配查詢 (status:"active"),map 函式發出了 4 個帶有鍵值對的文件,最後 reduce 函式將具有相同鍵的對映文件分組為 2 個。
要檢視此 MapReduce 查詢的結果,請使用 find 運算子:
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
上述查詢給出以下結果,表明 **tom** 和 **mark** 兩個使用者都分別有兩個處於活動狀態的帖子:
{ "_id" : "tom", "value" : 2 } { "_id" : "mark", "value" : 2 }
以類似的方式,MapReduce 查詢可用於構建大型複雜的聚合查詢。MapReduce 使用自定義 JavaScript 函式,非常靈活且強大。