mongo-mapreduce測試(1)——count/sum/where條件
mongo-mapreduce測試(2)——列轉行與finalize函數
mongo-mapreduce測試(3)——group by having
mongo-mapreduce測試(7)——使用js存儲過程
mongo-mapreduce測試(9)——python調用
mongo-mapreduce測試(10)——階段總結(2)
1. 准備測試數據
> db.tianyc_test3.insert({name:'xtt',dic:1})
> db.tianyc_test3.insert({name:'xtt',dic:2})
> db.tianyc_test3.insert({name:'xtt',dic:3})
> db.tianyc_test3.insert({name:'xtt',dic:4})
> db.tianyc_test3.insert({name:'xtt',dic:5})
> db.tianyc_test3.insert({name:'yct',dic:1})
> db.tianyc_test3.insert({name:'yct',dic:2})
> db.tianyc_test3.insert({name:'neu',dic:1})
> db.tianyc_test3.insert({name:'neu',dic:2})
> db.tianyc_test3.insert({name:'neu',dic:3})
> db.tianyc_test3.insert({name:'neu',dic:4})
> db.tianyc_test3.find()
{ "_id" : ObjectId("51258e47ff13bc6383473137"), "name" : "xtt", "dic" : 1 }
{ "_id" : ObjectId("51258e49ff13bc6383473138"), "name" : "xtt", "dic" : 2 }
{ "_id" : ObjectId("51258e4bff13bc6383473139"), "name" : "xtt", "dic" : 3 }
{ "_id" : ObjectId("51258e4eff13bc638347313a"), "name" : "xtt", "dic" : 4 }
{ "_id" : ObjectId("51258e50ff13bc638347313b"), "name" : "xtt", "dic" : 5 }
{ "_id" : ObjectId("51258e5aff13bc638347313c"), "name" : "yct", "dic" : 1 }
{ "_id" : ObjectId("51258e5cff13bc638347313d"), "name" : "yct", "dic" : 2 }
{ "_id" : ObjectId("51258e62ff13bc638347313e"), "name" : "neu", "dic" : 1 }
{ "_id" : ObjectId("51258e64ff13bc638347313f"), "name" : "neu", "dic" : 2 }
{ "_id" : ObjectId("51258e65ff13bc6383473140"), "name" : "neu", "dic" : 3 }
{ "_id" : ObjectId("51258e68ff13bc6383473141"), "name" : "neu", "dic" : 4 }
2. count
實現 select name, count(*) from tianyc_test3 group by name;
方法1:使用計數器累計
> var map = function() {
... emit(this.name, {cnt: 1});#設置cnt虛擬列,將每個collection的cnt設置為1。
... };
> var reduce = function(key, values) {
... var count = 0;
... for (var i=0;i<values.length;i++){
... count+=values[i].cnt;#對每個name的所有cnt進行相加,得到count結果。
... }
... return count;
... };
> var xjbu = db.tianyc_test3.mapReduce(map, reduce, {out: "tianyc_test3_result"});
> db.tianyc_test3_result.find()
{ "_id" : "neu", "value" : 4 }
{ "_id" : "xtt", "value" : 5 }
{ "_id" : "yct", "value" : 2 }
方法2:直接使用map后的數組長度。
map函數可以不變,也可再簡化:
> var map = function() {
... emit(this.name,1);
... };
reduce函數修改如下:
> var reduce = function(key, values) {
... return values.length;
... };
> var xjbu = db.tianyc_test3.mapReduce(map, reduce, {out: "tianyc_test3_result"});
> db.tianyc_test3_result.find()
{ "_id" : "neu", "value" : 4 }
{ "_id" : "xtt", "value" : 5 }
{ "_id" : "yct", "value" : 2 }
3. 帶where條件的count
實現 select name, count(*) from tianyc_test3 where dic>1 group by name;
方法1:使用mapReduce函數的query參數
> var xjbu = db.tianyc_test3.mapReduce(map, reduce, {query:{dic:{$gt:1}}, out: "tianyc_test3_result"});
> db.tianyc_test3_result.find()
{ "_id" : "neu", "value" : 3 }
{ "_id" : "xtt", "value" : 4 }
{ "_id" : "yct", "value" : { "cnt" : 1 } }
方法2:在map函數中過濾。reduce函數不變,map函數如下:
> var map = function() {
... if (this.dic>1){
... emit(this.name, {cnt: 1});
... }
... };
> var xjbu = db.tianyc_test3.mapReduce(map, reduce, {out: "tianyc_test3_result"});
> db.tianyc_test3_result.find()
{ "_id" : "neu", "value" : 3 }
{ "_id" : "xtt", "value" : 4 }
{ "_id" : "yct", "value" : { "cnt" : 1 } }
4. sum
實現 select name, sum(dic) from tianyc_test3 group by name
> var map = function() {
... emit(this.name, {score: this.dic});#設置score虛擬列,將每個collection的score設置為dic的值,用於reduce相加。
... };
> var reduce = function(key, values) {
... var sum = 0;
... for (var i=0;i<values.length;i++){
... sum+=values[i].score;#對每個name的所有score進行相加,得到sum結果。
... }
... return sum;
... };
> var xjbu = db.tianyc_test3.mapReduce(map, reduce, {out: "tianyc_test3_result2"});
> db.tianyc_test3_result2.find()
{ "_id" : "neu", "value" : 10 }
{ "_id" : "xtt", "value" : 15 }
{ "_id" : "yct", "value" : 3 }