MongoDB-分页,聚合函数,mapRedcue,游标

来源:互联网 发布:网络p2p理财产品 编辑:程序博客网 时间:2024/05/17 22:34

一  前言

          与关系型数据一样,NoSQL数据也存在数据分页,聚合操作,函数,游标等,来完成一些复杂的数据操纵。除此之外,也有一些分布式下的支持,如MongoDB中的Map,Reduce等,这些都会大数据的处理提供了安全,一致,高效的保证,下面为大家介绍MongoDB的高级操作

二  理论及应用

             (1) 数据查询分页,与MySQL,Oracle不同的是,MongoDB的分页是通过函数来实现:SKIP,limit,功能相似。

             SKIP(startIndex),startIndex:指查询数据集合的起始位置。
             limit(pageSize),pageSize:数据查询分页的大小。
              
              db.stu.find({$and:[{"username":{$ne:"Jerry"}},{"age":{$ne:20}}]}).skip(2).limit(10);;     查询出stu集合中username!=Jerry,且年龄大于20,并从第3(下标起始位0)条显示,每次分10条显示。
 


db.stu.find({$and:["username":{$ne:"Sherry"}},{"age":{$gte:20}}]}).skip(2).limit(10);   查询出username!= "Sherry"且年龄不小于20的数据集合,从第三个,按每页10条显示


(2)聚合函数:count,distinct,group,mapReduce

        count,distinct::与关系型数据一样,支持相应的统计操作。
        db.stu.count({"age":{$gte:40}}):        统计年龄不小于40的集合。
        db.stu.count({$and:[{"username":{$ne:"Jerry"}},{"age":{$gt:20}}]});     统计名字不是“Jerry”,年龄大于20的集合



    

   db.stu.distinct("age");         统计所有的年龄,剔除重复的
 
   


 (3)与SQL分组一样,也是要根据一些条件,进行分组,不同的是,MongoDB是以函数进行,并且分组依据,初始筛选集合对象,处理函数(reduce),筛选条件,结果处理等都是分开设置。
                "key"::分组依据(通SQL的group by 后的字段)
                “initial”: 进行分组操作的对象集合
                “condition”:额外的筛选条件
                 "$reduce":function(arg1,arg2){}    arg1:当前操作的文档对象 arg2:上一次函数操作的累计对象
                 “finalize”  :每次Reduce函数执行后,会执行该函数,可以用来进行统计和其他操作


 db.stu.group({
..  "key":{"age":true},
..  "initial":{"stu":[]},
..  "reduce":function(doc,out){
..       out.stu.push(doc.username);
.. },
.. "condition":{"age":{$gt:40}},
.. "finalize":function(out){
..         out.count = out.stu.length;
.. }
.. })





(4)mapReduce

            map是映射函数,里面会调用emit(key,value),集合会按照你的key进行映射分组。
            Reduce是数据处理,在分布式的环境下,对数据进行重新映射分组,



map = function(key,value){
...  emit(this.username,{count:1});
... }


function (key,value){
 emit(this.username,{count:1});
}



reduce = function(key,value){
... var result = {count:0};
... for(var i=0;i<value.length;i++){
...      result.count += value[i].count;
... }
... return result;
... }



function (key,value){
var result = {count:0};
for(var i=0;i<value.length;i++){
     result.count += value[i].count;
}
return result;
}







//使用mapReduce进行数据分组

db.stu.mapReduce(map,reduce,{"out":"collection"})



//查看分组后的结果
db.collection.find()





(5)游标:和数据一样,用来存取数据库查询中间结果或临时数据,进行再加工。
    var cursor  = db.stu.find({$or:[{"username":{$ne:"Jerry"}},{"age":{$gt:20}}]}) :将username!=“Jerry”,age>20的结果放入游标,用于进一步处理
   




三 总结

             总的来说,MongoDB和关系数据的分页查询,聚合操作,函数处理,游标有相似之处,但是有其强大之处,尤其mapreduce,在大数据量的操作占据优势,另外类似JS的函数编程方式,也易于理解,使用。
0 0