-
关系型数据库和非关系型数据库对比
-
Nosql不是关系模型构建的数据库,不保证数据一致性,结构灵活
-
Nosql弥补了关系型数据库在处理高并发数据请求时读写速度慢的缺点
-
Nosql种类多样,技术成熟度不如关系型数据库,没有统一的操作语句,发展速度较快
-
-
MongoDB数据库特点,安装,命令设置
-
MongoDB的组成结构
-
创建数据库
- use database 创建数据库
- db.dropDatabase() 删除数据库
- show dbs 查看数据库
数据库命令: mongodump 备份
mongorestore 恢复
mongostat 数据库监控
mongotop 监控读写时长 -
集合操作
db.createCollecion() 创建集合
db.collection.insert() 集合不存在自动创建
db.collection.drop() 删除集合
db.collection.renameCollection() 重命名
db.getCollection() 获取集合对象
show collections 查看集合 -
文档
- bson数据类型
- 键必须为字符串
-
插入文档
insertOne() 插入单个文档
insertMany() 插入多条文档
insert() 可以插入一条或者多条文档
save() 当_id冲突时可以修改原文档
一. 查找操作
-
命令格式
mysql: select … from table where … ;
mongo: db.collection.find(query,field)
-
查找函数使用
find(query,field)
功能:查找所有符合条件的文档,参数为空表示查找集合所有内容
参数:query 表示查找条件,是一个键值对文档
field 表示要查找的域,是一个键值对文档返回值: 返回查找到的所有文档
【1】 query : 通过键值对表示条件关系
e.g. {age:17} ==> age=17【2】 field : 键为域名,值为0表示不查找该域,1表示查找该域
- _id域如果不查找须明确 _id:0
- 普通域要么全指定为1,其他的默认是0,要么全指定为0,其他的默认为1
e.g. 查找所有年龄17的name age域
db.class0.find({age:17},{_id:0,name:1,age:1})findOne(query,field)
功能: 查找第一个符合条件的文档
参数: 同find
返回值: 返回查找到的文档
二. query 操作符使用
-
操作符:mongodb中使用$符号注明一个有特殊意义的字串,用以表达丰富的含义,比如 $lt 表示小于
-
比较操作符
【1】 $eq 等于 =
e.g. 年龄等于17 db.class0.find({age:{$eq:17}},{_id:0})
【2】 $lt 小于 <
e.g. name小于Lucy(字符串可以比较大小)
db.class0.find({name:{$lt:‘Lucy’}},{_id:0})【3】 $gt 大于 >
e.g. 年龄大于16并且小于18的
db.class0.find({age:{gt:16,gt:16,gt:16,lt:18}},{_id:0})【4】 $lte 小于等于 <=
【5】 $gte 大于等于 >=
【6】 $ne 不等于 !=【7】 $in 包含
e.g. 查找年龄包含在16,17,18中的
db.class0.find({age:{$in:[16,17,18]}},{_id:0})
【8】 $nin 不包含
-
逻辑操作符
【1】 $and 逻辑与
e.g. 查找年龄为18并且性别为女的 db.class0.find({$and:[{age:18},{sex:'w'}]},{_id:0}) * query文档中,多个键值对条件默认就是并且关系 e.g. db.class0.find({age:18,sex:'w'},{_id:0})
【2】 $or 逻辑或
e.g. 年龄小于18 或者性别为女 db.class0.find({$or:[{age:{$lt:18}},{sex:'w'}]},{_id:0})
【3】 $not 逻辑非
e.g. 年龄不小于18的 db.class0.find({age:{$not:{$lt:18}}},{_id:0})
【4】 $nor 逻辑异或 not (A or B)
e.g. 性别不为男,年龄不大于18 db.class0.find({$nor:[{sex:'m'},{age:{$gt:18}}]},{_id:0})
【5】 混合条件语句
* 年龄大于等于18或者小于17 并且 性别为女 db.class0.find({$and:[{$or:[{age:{$gte:18}},{age:{$lt:17}}]},{sex:'w'}]},{_id:0}) * 年龄大于等于18男生 或者 姓名为Levi或者Sunny db.class0.find({$or:[{age:{$gte:18},sex:'m'},{name:{$in:['Levi','Sunny']}}]},{_id:0})
-
数组查找操作符
【1】 数组 : 一组数据的有序集合,用[]表示
- 有序性
- 数组中数据类型可以混合
【2】 查找数组中某一项
e.g. 查找数组score中包含大于90的文档 db.class1.find({score:{$gt:90}},{_id:0})
e.g. 查找数组中第一项大于90
db.class1.find({‘score.0’:{$gt:90}},{_id:0})* 通过序列号表示数组某一项时必须加引号
【3】 查找数组中同时包含多项 $all
e.g. 查找数组中同时包含90 91的文档 db.class1.find({score:{$all:[90,91]}},{_id:0})
【4】 根据数组元素个数查找 $size
e.g. 查找数组中有4项的 db.class1.find({score:{$size:4}},{_id:0})
【5】 选择数组中查找的项 $slice (用于field参数)
e.g. 查找数组时只查找前两项 db.class1.find({},{_id:0,score:{$slice:2}}) e.g. 跳过数组前两项,显示接下来两项 db.class1.find({},{_id:0,score:{$slice:[2,2]}})
-
其他查找操作符
【1】 $exists 判断一个域是否存在
e.g. 查找存在sex域的文档 db.class0.find({sex:{$exists:true}},{_id:0})
【2】 $mod 根据除数 和余数筛选文档
e.g. 查找age除以2 余数 为1的文档 db.class0.find({age:{$mod:[2,1]}},{_id:0})
【3】 $type 根据数据类型查找
e.g. 查找姓名域数据类型为2的文档 db.class0.find({name:{$type:2}},{_id:0})
*数据类型对应number和alias需要查看type表
三. 数据操作函数
-
db.collection.distinct(field)
功能:获取集合中某个域的取值
参数:域名e.g. 查看年龄的取值情况
db.class0.distinct(‘age’) -
pretty()
功能:将find结果格式化显示e.g. db.class0.find().pretty()
-
limit(n)
功能:显示查询结果前n条e.g. 显示查询结果的前3条
db.class0.find({},{_id:0}).limit(3) -
skip(n)
功能: 跳过查询结果前n条,显示后边内容e.g. 跳过前3条文档,显示后面
db.class0.find({},{_id:0}).skip(3) -
count()
功能: 统计查询结果数量 -
sort({field:1/-1})
功能:对查找结果按照某个域排序
参数:field表示排序的域,1表示正序,-1表示逆序e.g. 对查找结果按照年龄升序排序
db.class0.find({},{_id:0}).sort({age:1})e.g. 可以进行复合排序
db.class0.find({},{_id:0}).sort({age:1,name:1}) -
函数的连续调用获取更丰富结果
查找年龄最大的三位同学
db.class0.find().sort({age:-1}).limit(3) -
通过序列号直接获取查找结果某一项
获取第二个男生文档
db.class0.find({sex:‘m’},{_id:0})[1]
练习:
-
创建数据库名为 grade
use grade -
在数据库中创建集合 class
-
集合中插入文档若干,格式如下
{name:xxx,age:xx,sex:xx,hobby:[xx,xx,xx]}
年龄: 7–15
hobby:draw dance running sing football basketball
computer python
db.class.insertOne({name:xxx,age:xx,sex:xx,hobby:[xx,xx,xx]})
- 查找练习
查看班级所有人信息
find()
查看班级中年龄8岁的学员信息
find({age:8})
查看年龄大于10岁的所有学生
find({age:{$gt:10}})
查看年龄在8-12岁的学生
find({age:{$gte:8,$lte:12}})
查看年龄为9岁且喜欢画画的女生
find({age:9,hobby:'draw',sex:'w'})
查看年龄小于8岁或者大于12岁的学生
find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
查看年龄9岁到11岁学生
find({age:{$in:[9,11]}})
查看有两项兴趣爱好的学生
find({hobby:{$size:2}})
查看喜欢计算机的同学
find({hobby:'computer'})
查看喜欢画画又喜欢跳舞的女生
find({sex:'w',hobby:{$all:['draw','dance']}})
统计兴趣有3项的学生人数
find({hobby:{$size:3}}).count()
找到班级中年龄第二大的学生
find().sort({age:-1}).skip(1).limit(1)
查看班级同学都有哪些爱好
db.class.distinct('hobby')
找到年龄最小的2个男生
find({sex:'m'}).sort({age:1}).limit(2)
四. 修改文档
-
格式对比
mysql:update table set … where …
mongo: db.collection.updateOne(query,update,upsert)
-
修改函数
【1】 updateOne(query,update,upsert)
功能: 修改第一个符合条件的文档
参数:query 筛选条件
update 要修改的数据项,需要同修改器一起使用
upsert 表示当要修改的项没有找到时是否插入新的文档
e.g. 将dail年龄修改为16
db.class0.updateOne({name:'Dail'},{$set:{age:16}})
e.g. 如果没有找到Alex则插入新的文档
db.class0.updateOne({name:'Alex'},{$set:{age:19}},{upsert:true})
【2】 updateMany(query,update,upsert)
功能:修改所有符合条件的文档
参数:用法同updateOne
e.g. 修改所有不存在sex域年龄为20
db.class0.updateMany({sex:{$exists:false}},{$set:{age:20}})
【3】 db.collection.update(query,update,upsert,multi)
功能: 修改一条或者多条文档
参数: query,update参数用法同上
upsert 含义同上,用法为直接复制 upsert=ture
multi 为false 表示只修改一条,为true表示修改多条
e.g. 修改所有年龄20的为年龄21
db.class0.update({age:20},{$set:{age:21}},false,true)
作业:
- 熟练今天所学函数和操作符用法
- 将’银行’数据库 练习查找和基础修改