一 前言
与关系型数据一样,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;
.. }
.. })
.. "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});
... }
... 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;
... }
... 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的函数编程方式,也易于理解,使用。