3.4 查询文档(find)
比较条件 符号 事例
等于 : db.stu.find({price:24})
大于 $gt: db.stu.find({price:{$gt:24}})
小于 $lt: db.stu.find({price:{$lt:24}})
大于等于 $gte: db.stu.find({price:{$gte:24}})
小于等于 $lte: db.stu.find({price:{$lte:24}})
不等于(数值) $ne: db.stu.find({price:{$ne:24}})
不等于(字符串) $not: db.stu.find({name:{$not:"《MongoDB 教程》"}})
与 { , ,} db.stu.find({price:{$gt:24}},{name:"《MongoDB教程》"})
或 $or[{ , ,}] db.stu.find({$or:[{price:{$gt:24}},{name:"《MongoDB教程》"}]})
包含 $in: db.stu.find({price:{$in:[23,24,25]}})
不包含 $nin: db.stu.find({price:{$nin:[23,24,25]}})
包含元素个数 $size:
tags属性中值为数组且包含三个元素的
db.stu.find(tags:{$size:3}})
配合find使用的其它方法
#
age:null不仅会匹配到age的值为null的文档,还会匹配到不包含age这个键的文档。 db.stu.find({age:null}) #限制返回值 db.stu.find().limit(3) #指定跳过第几个文档 db.stu.find().skip(3) //跳过第三个 #查询结果排序 查询结果按照指定属性升序显示(-1降序) db.stu.find().sort({"属性":1})
4 游标
db.stu.find()返回的就是一个游标,可以声明一个变量进行接收,它是数据遍历过程中的内部指针,是数据读取的接口。
游标使用find方法返回,故上面说到配合find方法使用的sort、limit、skip等方法也可以使用,此外还有hint方法(强制使用索引进行查询)。
#声明游标并进行遍历 var cursor = db.stu.find() //声明游标 while (cursor.hasNext()){ //判断游标的下一位有没有值 var doc = cursor.next(); //有值的情况下在声明变量进行接收 print(doc.name); // print(doc); //输出的是一条BSON类型的数据 printjson(doc); //转成JSON的形式输出 print(tojson(doc)); //同上一行效果 }
5 索引
什么叫索引呢?在没有索引的情况下,用户要是想要查询某个文档的话就必须扫描集合中的所有文档,来选择与查询条件相匹配的文档。然而,在有索引存在的情况下,用户可以先查询索引中是否有想要查询的文档,如果有的情况下就可以直接读,从而节约了大量的时间。
索引的优点:提升文档的查询速率。相对而言,因为插入新的文档会引起索引顺序的重拍,从而会降低插入、更新的速率。
MongoDB的索引基于B-tree数据结构,MySQL的索引基于B+tree数据结构。
#单索引 对stu集合中的score字段创建升序索引(-1降序) 索引名为:index1(索引名默认为字段名_1) db.stu.createIndex({score:1},name:"index1") #复合索引 对stu集合中的score字段创建升序索引,state降序索引 db.stu.createIndex({score:1,state:-1}) #唯一索引 对stu集合中的score字段创建升序唯一索引 db.stu.createIndex({score:1},{unique:true}) #查询stu集合的所有索引 db.stu.getIndexes() #查询索引所占空间大小 db.stu.totalIndexSize() #删除索引 索引的所有属性都不能有所不同,否则会删错索引,或提示无此索引 db.stu.dropIndex({score:1}) 删除除_id索引外的所有索引 db.stu.dropIndexes() #修改索引 先删除需要修改的索引,在创建一个修改后的索引
6 聚合
对返回的文档进行统计分析,使用aggregate方法实现。
💥管道操作:$match(过滤) $group(分组) $project(显示字段) $sort(排序) $limit(限制) $skip(跳过)
💥聚合运算符: $sum(求和) $avg(均值) $min(最小值) $max(最大值) $first $last $push
#只显示stu集合里文档的quantity和pnumber字段 db.stu.aggregate({$project:{quantity:1,pnumber:1,price:0}}) #过滤出stu集合里price大于4.0的所有文档 db.stu.aggregate({$match:{price:{$gt:4.0}}}) #对price字段升序排列 db.stu.aggregate({$sort:{price:1}}) #返回stu集合的前三个文档并跳过第一项 db.stu.aggregate({$limit:3},{$skip:1})
分组求和的两种方式
#管道聚合 按编号分组,并统计商品数量 db.stu.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}}]) #MapReduce var mapFunc = function(){ emit(this.pnumber,this.quantity); }; var reduceFunc = function(key,values){ return Arrary.sum(values); }; db.stu.mapReduce(mapFunc,reduceFunc,{out:{replace:'result'}}) //创建一个集合用来接收结果