mongo-mapreduce測試(1)——count/sum/where條件


mongo-mapreduce測試(1)——count/sum/where條件

mongo-mapreduce測試(2)——列轉行與finalize函數

mongo-mapreduce測試(3)——group by having

mongo-mapreduce測試(4)——avg

mongo-mapreduce測試(5)——max/min

mongo-mapreduce測試(6)——綜合測試

mongo-mapreduce測試(7)——使用js存儲過程

mongo-mapreduce測試(8)——階段總結(1)

mongo-mapreduce測試(9)——python調用

mongo-mapreduce測試(10)——階段總結(2)

mongo-mapreduce測試(11)——跟蹤調試

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM