MongoDB下Map-Reduce使用簡單翻譯及示例

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操做提供了一些目前在聚合管道中不可用的靈活性。數據庫

Map-Reduce JavaScript 函數

在MongoDB中,map-reduce操做使用自定義JavaScript函數將值(value)映射或關聯到鍵(key)。 若是某個鍵(key)有對應多個值(value),則該操做應該將鍵的值reduces單個對象json

使用自定義JavaScript函數能夠靈活地進行map-reduce操做。 例如,在處理文檔時,map函數能夠建立多個鍵和值映射或不進行映射。 Map-reduce操做還可使用自定義JavaScript函數對映射的結果進行最終修改,並在映射操做的最後階段進行reduce操做,執行其餘計算。函數

Map-Reduce 行爲

在MongoDB中,map-reduce操做能夠將結果寫入集合或返回結果內聯。 若是將map-reduce輸出寫入集合,則能夠在合併替換,合併或減小新結果與先前結果的同一輸入集合上執行後續map-reduce操做。 有關詳細信息和示例,請參閱mapReducePerform Incremental(執行增量) Map-Reduce性能

當返回map-reduce操做的內聯結果時,結果文檔必須在BSON文檔大小限制內,該限制當前爲16兆字節。 有關map-reduce操做的限制和限制的其餘信息,請參閱mapReduce參考頁面。測試

MongoDB支持分片集合上的map-reduce操做。 Map-reduce操做還能夠將結果輸出到分片集合。 請參見Map-Reduce and Sharded Collectionsthis

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"
    }
}
相關文章
相關標籤/搜索