查询操作: db.stu.find() //查询所有数据 db.stu.findOne() //查询一个数据 db.stu.find().pretty() //查询之后,格式化显示 db.stu.find({title:'html'}) //查询title为html的 db.stu.find({age:{$gte:18}}) //查询年龄大于等18的学生 逻辑与 db.stu.find({title:'python',count:{$gt:2}}) //查询title为python并且count大于2的 逻辑或 db.stu.find({$or:[{title:'python'},count:{$gt:2}]})//查询title为python 或者count大于2 in 或者 not in db.stu.find({count:{$in:[1,2]}}) //查找count为1或者2的 db.stu.find({count:{$nin:[1,2]}}) //查找count不1或者2的 支持正则表达式 db.stu.find({name:/^黄/}) //查找名字以黄开头的 与js正则一样 db.stu.find({name:{$regex:"^黄"}}) //与上面等价 自定义查询函数(js函数) db.stu.find({$where:function(){return this.age>20}})//与js一样,返回age大于20的数据 db.stu.find({$where:function(){return this.name.startwith('黄')}})//中间的函数是js代码,也就是说js字符串的函数都能被使用 limit用于读取指定数量的文档 skip用于跳过指定数量的文档 db.stu.find().limit(5) //读取返回的5条数据 db.stu.skip(2) //跳过2条数据,也就是从第三条数据开始显示 db.stu.skip(5).limit(5)//跳过前5条,从第6条开始显示接下来的5条数据 投影:查询结果中,只返回选择的字段 如:一个文档有5个字段,只显示前面3个 db.stu.find({查询条件},{name:1})//默认情况下_id是显示的,不想其显示,可以将_id设置为0 name:1说明显示name字段 db.stu.find({},{_id:0,name:1,age:1})//显示name和age 排序 默认排序是根据objectid进行的 sort{属性a:1,属性b:-1} 1为升序,-1降序 db.stu.find().sort({age:1}) db.stu.find().sort({age:-1})//按照age降序排序 统计个数 count() db.stu.find({条件}).count() db.stu.find({age:{$gt:20}}).count()//查询年龄大于20 db.stu.count({age:{$gt:20}}) //查询年龄大于20 数据去重 db.stu.distinct('去重字段',{条件}) db.stu.distinct('gender',{age:{$gt:20}})//对gender进行去重 聚合(用于统计) 主要计算数据 db.集合.aggregate([{管道:{表达式}}]) 常用管道: $group:将集合中文档分组 $match:过滤数据 $project:修改输入文档的结构,如重命名,增加删除字段,创建计算结构 $sort:将输入文档排序后输出 $limit:限制聚合管道返回的文档数 $skip:跳过指定文档的数量 $unwind:将数组类型的字段进行拆分 表达式 语法: '$列名' 常用表达式 $sum $avg $min $max $push $first $last db.stu.aggregate([ { $group:{ _id:'$gender',//基于哪个字段进行分组.这里是基于gender进行分组 # _id:null,//将整个集合文档分为一组 # counter:{$sum:1}//counter为结果的名字,$sum计算分组中的个数 # counter:{$sum:'$age'}, # counter:{$first:'$gender'}, # counter:{$push:'$age'},//将分组的结果放到数组中(只存放每个文档的age属性) # counter:{$push:'$$ROOT'},//将分组的结果放到数组中(将整个文档push到数组中) } } ]) db.stu.aggregate([ { $match:{age:{$gt:20}, //查询年龄大于20}, $group:{ _id:"$gender", counter:{$sum:'$age'} //把查询年龄大于20,作为分组的下一次数据 } } ]) db.stu.aggregate([ {$match:{age:{$gt:20}, //查询年龄大于20}} {$group:{ _id:"$gender", counter:{$sum:'$age'} //把查询年龄大于20,作为分组的下一次数据 }}, {$project:{_id:0,counter:1}}, ]) db.stu.aggregate([ {$match:{age:{$gt:20}, //查询年龄大于20}} {$group:{ _id:"$gender", counter:{$sum:'$age'} //把查询年龄大于20,作为分组的下一次数据 }}, {$project:{_id:0,counter:1}}, {$sort:{counter:1}}, ]) db.stu.aggregate([ {$match:{age:{$gt:20}, //查询年龄大于20}} {$group:{ _id:"$gender", counter:{$sum:'$age'} //把查询年龄大于20,作为分组的下一次数据 }}, {$project:{_id:0,counter:1}}, {$sort:{counter:1}}, {$skip:1},//跳过去1个 ]) db.stu.aggregate([ {$match:{age:{$gt:20}, //查询年龄大于20}} {$group:{ _id:"$gender", counter:{$sum:'$age'} //把查询年龄大于20,作为分组的下一次数据 }}, {$project:{_id:0,counter:1}}, {$sort:{counter:1}}, {$skip:1},//跳过去1个 {$limit:1},//取出一个 ]) db.stu.insert({_id:1,title:'t-shirt',size:['M','L','S']}) db.stu.aggregate([ {$unwind:'$size'}//将size字段进行拆分 #{_id:1,title:'t-shirt',size:'M'} #{_id:2,title:'t-shirt',size:'L'} #{_id:3,title:'t-shirt',size:'S']} ]) 拆分遇到null 空 没有 三种情况会出现数据丢失,解决办法 db.stu.insert({_id:1,title:'t-shirt',size:[]}) db.stu.insert({_id:2,title:'t-shirt'}) db.stu.insert({_id:3,title:'t-shirt',size:null}) db.stu.aggregate([ {$unwind:{path:'$size',preserverNullAndEmptyArrays:true}}//将size字段进行拆分 ]) 采用角色-用户-数据管理方式 常用系统角色: root:超级权限 read:允许用户读 readwrite:允许读写 常见超级管理员 use admin db.createUser({ user:"admin", pwd:'123', roles:[{role:'root',db:'admin'}] }) 默认没有授权,要修改配置文件 mongo -u admin -p 123 --authenticationDatabase test1 流程: 创建超级管理员 修改配置文件,启用身份验证 重启服务 使用超级管理员登陆 创建普通用户 使用普通用户登录 复制(副本集) 工作原理 设置复制