目錄javascript
Map-reduce是一種數據處理範例,用於將大量數據壓縮爲有用的聚合結果。 對於map-reduce操做,MongoDB提供了mapReduce數據庫命令。
一個簡單的map-reduce
示例以下:html
在此map-reduce
操做中,MongoDB將映射(map)
操做應用於每一個輸入文檔(即集合中與查詢條件匹配的文檔)。map函數提交(emit)一個鍵值對(key-value)。對於具備多個值的key鑰,MongoDB應用reduce
操做,該操做用於聚合數據。而後MongoDB將結果存儲在一個集合
中。reduce函數的輸出還能夠選擇經過finalize
函數以進一步壓縮或處理聚合的結果。java
MongoDB中的全部map-reduce函數都是JavaScript,並在mongod進程中運行。 Map-reduce操做將單個集合的文檔做爲輸入,並可在開始映射階段以前執行任意排序和限制。 mapReduce能夠將map-reduce操做的結果做爲文檔返回,也能夠將結果寫入集合。 輸入和輸出集合能夠分片。mongodb
對於大多數聚合操做,聚合管道( Aggregation Pipeline)[https://docs.mongodb.com/manual/core/aggregation-pipeline/]提供更好的性能和更一致的接口。 可是,map-reduce操做提供了一些目前在聚合管道中不可用的靈活性。數據庫
在MongoDB中,map-reduce操做使用自定義JavaScript函數將值(value)映射或關聯到鍵(key)。 若是某個鍵(key)有對應多個值(value),則該操做應該將鍵的值reduces
爲單個對象。json
使用自定義JavaScript函數能夠靈活地進行map-reduce操做。 例如,在處理文檔時,map函數能夠建立多個鍵和值映射或不進行映射。 Map-reduce操做還可使用自定義JavaScript函數對映射的結果進行最終修改,並在映射操做的最後階段進行reduce操做,執行其餘計算。函數
在MongoDB中,map-reduce操做能夠將結果寫入集合或返回結果內聯。 若是將map-reduce輸出寫入集合,則能夠在合併替換,合併或減小新結果與先前結果的同一輸入集合上執行後續map-reduce操做。 有關詳細信息和示例,請參閱mapReduce和Perform Incremental(執行增量) Map-Reduce。性能
當返回map-reduce操做的內聯結果時,結果文檔必須在BSON文檔大小限制內,該限制當前爲16兆字節。 有關map-reduce操做的限制和限制的其餘信息,請參閱mapReduce參考頁面。測試
MongoDB支持分片集合上的map-reduce操做。 Map-reduce操做還能夠將結果輸出到分片集合。 請參見Map-Reduce and Sharded Collections。this
Views(視圖)不支持map-reduce操做。
MongoDB地理空間數據存儲及檢索
上面連接是以前曾經作過一個全國縣級行政邊界矢量入庫到MongoDB的記錄,這裏用它來測試一下。
簡單的測試一下全國每一個省都有多少個縣
db.getCollection('xzbj').mapReduce( function() { emit(this.properties.sheng,1);}, function(key,values){return Array.sum(values);}, { query:{}, out:"xian_count" } )
這裏將結果輸出到了xian_count
這個新的集合中,能夠打開這個集合查看結果。
上面的query
也能夠沒有,就是默認集合內所有文檔。
若是不想把結果輸出到一個集合,直接顯示結果,則可使用out: { inline: 1 }
。
計算一下湖南省每一個地級市有多少個縣
使用下面語句
db.getCollection('xzbj').mapReduce( function() { emit(this.properties.di,1);}, function(key,values){return Array.sum(values);}, { query:{ 'properties.sheng':'湖南'}, out: { inline: 1 } } )
獲得輸出以下(這裏若是是針對全國的數據是有問題的,由於以前沒有正確處理港澳臺數據):
{ "results" : [ { "_id" : "婁底市", "value" : 5.0 }, { "_id" : "岳陽市", "value" : 7.0 }, { "_id" : "常德市", "value" : 9.0 }, { "_id" : "張家界市", "value" : 3.0 }, { "_id" : "懷化市", "value" : 12.0 }, { "_id" : "株洲市", "value" : 6.0 }, { "_id" : "永州市", "value" : 10.0 }, { "_id" : "湘潭市", "value" : 4.0 }, { "_id" : "湘西土家族苗族自治州", "value" : 8.0 }, { "_id" : "益陽市", "value" : 6.0 }, { "_id" : "衡陽市", "value" : 8.0 }, { "_id" : "邵陽市", "value" : 11.0 }, { "_id" : "郴州市", "value" : 11.0 }, { "_id" : "長沙市", "value" : 5.0 } ], "timeMillis" : 19.0, "counts" : { "input" : 105, "emit" : 105, "reduce" : 14, "output" : 14 }, "ok" : 1.0, "_o" : { "results" : [ { "_id" : "婁底市", "value" : 5.0 }, { "_id" : "岳陽市", "value" : 7.0 }, { "_id" : "常德市", "value" : 9.0 }, { "_id" : "張家界市", "value" : 3.0 }, { "_id" : "懷化市", "value" : 12.0 }, { "_id" : "株洲市", "value" : 6.0 }, { "_id" : "永州市", "value" : 10.0 }, { "_id" : "湘潭市", "value" : 4.0 }, { "_id" : "湘西土家族苗族自治州", "value" : 8.0 }, { "_id" : "益陽市", "value" : 6.0 }, { "_id" : "衡陽市", "value" : 8.0 }, { "_id" : "邵陽市", "value" : 11.0 }, { "_id" : "郴州市", "value" : 11.0 }, { "_id" : "長沙市", "value" : 5.0 } ], "timeMillis" : 19, "counts" : { "input" : 105, "emit" : 105, "reduce" : 14, "output" : 14 }, "ok" : 1.0 }, "_keys" : [ "results", "timeMillis", "counts", "ok" ], "_db" : { "_mongo" : { "slaveOk" : true, "host" : "127.0.0.1:27017", "defaultDB" : "test", "_readMode" : "commands" }, "_name" : "us" } }