Mongodb数据查询 | Mongodb
1.基本查询 ①方法find():查询 db.集合名称.find({条件文档}) ②方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) ③方法pretty():将结果格式化 db.集合名称.find({条件文档}).pretty() 2.比较运算符 # 等于,默认是等于判断,没有运算符 # 小于,$lt less-than # 小于或等于,$lte less-than,equal # 大于,$gt greater-than # 小于或等于,$gte greater-than,equal # 不等于,$ne not equal db.collection2.find({name:'郭靖'}) db.collection2.find({age:{$gte:18}}) 3.逻辑运算符 ①逻辑与 # 默认是逻辑与的关系 # 例:查询年龄大于或等于18,并且性别为true的学生 db.collection2.find({age:{$gte:18}, gender:true}) ②逻辑或 # 使用$or,值为数组,数组中每个元素为json # 例:查询年龄大于18,或性别为false的学生 db.collection2.find({$or:[{age:{$gt:18}},{gender:false}]}) 注意点:find() >> 或条件下的{} >> $or[ ] >> >> {条件a},{条件b} >> {域:{ 逻辑符判断} } ③或、与共用 # 例:查询年龄大于18或姓名是郭靖,并且性别为男生 db.collection2.find( {$or:[ {age:{$gt:18} },{name:'郭靖'} ],gender:true} ) 4.范围运算符 # $in|$nin # 例:查询年龄为18,28的学生 db.collection2.find( {age:{$in:[18, 28] } } ) # 这里要注意了,最大与最小都需要表中含有这几个数 5.支持正则表达式 # 使用 // 或 $regex 编写正则表达式 # 例:db.collection2.find( {name:/^黄/} ) db.collection2.find( {name:{$regex:'^黄'} } ) 6.自定义查询 # 使用$where后面写一个函数,返回满足条件的数据 # 例:查询大于30岁的学生 db.collection2.find( { $where: function(){ return this.age > 18 }}) 7.Limit和Skip ①方法limit():读取指定数量的文档 # db.集合名称.find().limit(NUMBER) db.collection2.find().limit(2) # 附:如果指定参数则显示集合中的所有文档 ②方法skip():用于跳过指定数量的文档 # db.集合名称.find().skip(NUMBER) db.stu.find().skip(2) # 附:参数NUMBER表示跳过的记录条数,默认为0 ③limit()与skip()一起使用 # 不分先后顺序;跳过指定数量文档,再读取指定数量的文档 # 查询数据 db.collection1.find().limit(4).skip(5) db.collection1.find().skip(5).limit(4) 8.投影 --选择字段显示数据 # ①db.集合名称.find({},{ 字段名称:1, ...}) db.collection2.find({},{name:1, gender:1}) # '1':表示显示字段,不设置表示不显示 # ②特殊:对于_id列默认是显示的, # 如果不显示需要明确设置为0 db.collection2.find({},{_id:0,name:1,gender:1}) 9.排序 --对结果集进行排序 参数1为升序排列 参数-1位降序排列 # db.集合名称.find().sort({字段:1....}) # --根据性别降序,再根据年龄升序 db.collection2.find().sort({gender:-1,age:1}) 10.统计个数 ①方法count():用于统计结果集中文档条数 1.db.集合名称.find({条件}).count() db.collection2.find({gender:true}).count() # --统计男生人数 2.db.集合名称.count({条件}) db.collection2.count({age:{$gt:20}, gender:true}) # --统计年龄大于20的男生人数 11.消除重复 ①方法distinct():对字段数据进行去重,提取 --db.集合名称.distinct('去重字段',{条件}) db.collection2.distinct('hometown',{age:{$gt:18}}) # 查询年龄大于18岁的学生,来自哪些省份 # 4.聚合查询 1.基本语法 --语法 db.集合名称.aggregate( {管道: {表达式} } ) 附: 1.管道:在Unix和Linux中一般用于将当前命令的 输出结果作为下一个命令的输入 2.表达式:处理输入文档并输出 2.常用表达式 $sum: 计算综合,$sum:1 表示以一倍计数 $avg: 计算平均值 $min: 获取最小值 $max: 获取最大值 $push: 在结果文档中插入值到第一个文档数据 $first: 根据资源文档的排序获取第一个文档数据 $last: 根据资源文档的排序获取最后一个文档数据 3.常用管道 ①$group --将集合中的文档分组,可用于统计结果 --_id表示分组的依据,使用某个字段的格式为'$字段' # 统计男生、女生的总人数 db.stu.aggregate( {$group: { _id:'$gender', counter:{$sum:1} } } ) --透视数据 # 统计学生性别及学生姓名 db.stu.aggregate( {$group: { _id:'$gender', name:{$push:'$name'} } } ) --使用$$ROOT可以将文档内容加入到结果集的数组中 db.stu.aggregate( {$group: { _id:'$gender', name:{$push:'$$ROOT'} } } ) ②$match --修改输入文档的结构,如重命名、增加、删除字段、创建计算结果 --用于过滤数据,只输出符合条件的文档 --使用MongoDB的标准查询操作 # 查询年龄大于20的学生 db.stu.aggregate( {$match:{age:{$gt:20}}} ) # 查询年龄大于20的男生、女生人数 db.stu.aggregate( {$match:{age:{$gt:20}}}, {$group:{_id:'$gender',counter:{$sum:1}}} ) ③$project --修改输入文档的结构, 如重命名、增加、删除字段、创建计算结果 # 查询学生的姓名、年龄 db.stu.aggregate( {$project:{_id:0,name:1,age:1}} ) # 查询男生、女生人数,输出人数 db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$project:{_id:0,counter:1}} ) ④$sort --将输入文档排序后输出 # 查询学生信息,按年龄升序 b.stu.aggregate({$sort:{age:1}}) # 查询男生、女生人数,按人数降序 db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:-1}} ) ⑤$limit和$skip --$limit # 限制聚合管道返回的文档数 # 查询2条学生信息 db.stu.aggregate({$limit:2}) --$skip # 跳过指定数量的文档,并返回余下的文档 # 查询从第3条开始的学生信息 db.stu.aggregate({$skip:2}) # 统计男生,女生人数,按人数升序,取第2条数据 db.stu.aggregate( {$group:{_id:'$gender', counter:{$sum:1}}} {$sort:{counter:1}} {$skip:1} {$limit:1} ) ⑥$unwind字段拆分查询 --语法 --文档中一个数组字段含有多个值 --根据字段下的值拆分多条 --每条包含数组中的一个值 --db.集合名称.aggregate({$unwind:'$字段名称'}) # $unwind聚合方法下含有两个属性: path:'$字段名称' preserveNullAndEmptyArrays:<布尔值> # 不填写属性,默认表示<布尔值>为false # 且不用标记属性名 --构造数据 db.t3.insert([ { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] }, { "_id" : 2, "item" : "b", "size" : [ ] }, { "_id" : 3, "item" : "c", "size": "M" }, { "_id" : 4, "item" : "d" }, { "_id" : 5, "item" : "e", "size" : null } ]) --查看查询结果,显示对空数组,无字段,null的文档 db.t3.aggregate( { $unwind:{ path:'$size', preserveNullAndEmptArrays:true}}) --查看查询结果,不显示空数组,无字段,null的文档 db.t3.aggregate({$unwind: '$size'}) 相当于: db.t3.aggregate({$unwind:{path:'$size', preserveNullAndEmptyArrays:false}})