前情回顾
1. 关系型数据库和非关系型数据库
* Nosql不是关系模型构建的数据库,不保证数据一致性,结构灵活
* NoSql弥补了关系型数据库高并发数据处理速度慢的缺点
* Nosql种类多样,技术成熟度不如关系型数据库
2. mongodb数据库特点,安装,命令设置
3. mongodb的组成结构
4. mongodb的数据类型
5. 数据库操作
* use database 选择数据库不存在则创建
* db.dropDatabase() 删除数据库
* show dbs 查看数据库
命令 : mongodump 备份
mongorestore 恢复
mongostat 数据库监控
mongotop 查看读写时长
6. 集合操作:
db.createCollection() 创建集合
db.collection.insert() 集合不存在自动创建
db.collection.drop() 删除集合
db.collection.renameCollection() 重命名
show collections 查看集合
db.getCollection('class') 获取集合对象
7. 文档插入
insertOne()
insertMany()
insert()
save() 当_id冲突时会替换原文档
8. 查找函数
find(query,field)
************************************************
cookie:
计算机基础课 : 计算机原理,算法导论,编程原理
公众号 : python程序员 python开发者 算法爱好者
app : 知乎 掘金
网站 : 伯乐在线 CSDN
一. 数据操作(续)
1. 查找函数
db.collection.findOne(query,field)
功能: 查找第一个复合条件的文档
参数: 同find
返回:返回查找到的文档
e.g. 查找第一个性别为男的文档
db.class0.findOne({sex:'m'},{_id:0})
2. query操作符使用
操作符:mongodb中使用$符号注明的一个有特殊意义的字符串,用以表达丰富的含义,比如:$lt 表示小于
比较操作符
【1】 $eq 等于 =
e.g. 年龄等于17
db.class0.find({age:{$eq:17}},{_id:0})
【2】 $lt 小于 <
e.g. 字符串可以比较大小
db.class0.find({name:{$lt:'Tom'}},{_id:0})
【3】 $gt 大于 >
e.g. 查找一个区间范围
db.class0.find({age:{$gt:17,$lt:20}},{_id:0})
【4】 $lte 小于等于 <=
【5】 $gte 大于等于 >=
【6】 $ne 不等于 !=
【7】 $in 包含
e.g. 查找年龄在数组范围的
db.class0.find({age:{$in:[17,19,21]}},{_id:0})
【8】 $nin 不包含
e.g. 查找年龄不在数组范围的
db.class0.find({age:{$nin:[17,19,21]}},{_id:0})
逻辑操作符
【1】 $and 逻辑与
e.g. 查找年龄小于19 并且性别为w的
db.class0.find({$and:[{age:{$lt:19}},{sex:{$ne:'w'}}]},{_id:0})
* query中的多个条件本身也表示并且关系
【2】 $or 逻辑或
e.g. 查找年龄大于18或者性别为w
db.class0.find({$or:[{age:{$gt:18}},{sex:'w'}]},{_id:0})
【3】 $not 逻辑非
e.g. 查找年龄不大于18的
db.class0.find({age:{$not:{$gt:18}}},{_id:0})
【4】 $nor 既不也不(多个条件均为假则结果为真)
e.g. 年龄不大于18 性别不为 m
db.class0.find({$nor:[{age:{$gt:18}},{sex:'m'}]},{_id:0})
【5】 混合条件语句
年龄大于等于19或者小于18 并且 性别为 w
db.class0.find({$and:[{$or:[{age:{$gte:19}},{age:{$lt:18}}]},{sex:'w'}]},{_id:0})
(年龄大于等于17的男生) 或者 (姓名叫 Abby 或者Emma)
db.class0.find({$or:[{age:{$gte:17},sex:'m'},{name:{$in:['Abby','Emma']}}]},{_id:0})
数组操作符
【1】 查找数组中包含元素
e.g. 查找score数组中元素包含大于90的文档
db.class2.find({score:{$gt:90}},{_id:0})
【2】 $all 查找数组中同时包含多项
e.g. 查找数组中同时包含87,89的文档
db.class2.find({score:{$all:[87,89]}},{_id:0})
【3】 $size 根据数组的元素个数查找
e.g. 查找数组中包含3个元素的文档
db.class2.find({score:{$size:3}},{_id:0})
【4】 $slice 用于field参数,表示查找数组哪些项
e.g. 查找数组中的前两项
db.class2.find({},{_id:0,score:{$slice:2}})
e.g. 跳过数组第一项,查看后面两项
db.class2.find({},{_id:0,score:{$slice:[1,2]}})
【5】 通过数组索引进行查找
e.g. 查找数组第二项大于80的文档
db.class2.find({'score.1':{$gt:80}},{_id:0})
* 通过score.1表示第二项,需要加引号表达
其他操作符
【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. 查找 age域值为 字符串类型的
db.class2.find({age:{$type:2}},{_id:0})
* 数据类型与数字对应查看type表
二. 数据操作函数
1. db.collection.distinct(field)
功能: 获取集合中某个域的值范围
参数: 域名
返回值: 取值的范围 数组
e.g. 查找class0 age域有哪些值
db.class0.distinct('age')
2. pretty()
功能: 将find结果格式化显示
3. limit(n)
功能: 显示查询结果的前n条
e.g. 显示查询结果前3条
db.class0.find({},{_id:0}).limit(3)
4. skip(n)
功能 : 跳过前n条显示后面的文档
e.g. 跳过前5个文档,显示后面内容
db.class0.find({},{_id:0}).skip(5)
5. count()
功能: 统计查询结果数量
e.g. 统计年龄大于18的文档个数
db.class0.find({age:{$gt:18}},{_id:0}).count()
6. sort({field:1/-1})
功能: 对查找结果排序
参数: field 表示排序的域,1升序 -1降序
e.g. 年龄为数字的域按照降序排序
db.class0.find({age:{$type:1}},{_id:0}).sort({age:-1})
e.g. 复合排序(第一排序项相同的时候按照第二项排序)
db.class0.find({age:{$type:1}},{_id:0}).sort({age:1,name:1})
7. 函数连续调用
如果上一个函数返回的仍是一个文档集合则可以继续调用下一个操作函数
e.g. 查找年龄最大的三位同学
db.class0.find({age:{$type:1}},{_id:0}).sort({age:-1}).limit(3)
8. 通过序列号直接获取文档集合中某一个
e.g. 获取文档集合第二项
db.class0.find({},{_id:0}).sort({age:1})[1]
练习:使用grade
1. 查看班级中所有人信息
find()
2. 查看班级中年龄8岁的人员信息
find({age:8})
3. 查看年龄大于10岁的学生信息
find({age:{$gt:10}})
4. 查看年龄8-12之间的学生信息
find({age:{$gte:8,$lte:12}})
find({$and:[{age:{$gte:8}},{age:{$lte:12}}]})
5. 查看年龄为9岁且喜欢画画的女生
find({age:9,sex:'w',hobby:'draw'})
6. 查看年龄小于8岁或者大于12岁的同学
find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
7. 查看年龄9岁或者11岁的学生
find({age:{$in:[9,11]}})
8. 查看有两项兴趣爱好的学生
find({hobby:{$size:2}})
9. 查找喜欢计算机的同学
find({hobby:'computer'})
10. 查找既喜欢画画又喜欢跳舞的同学
find({hobby:{$all:['draw','dance']}})
11. 统计兴趣爱好有3项的学生人数
find({hobby:{$size:3}).count()
12. 找到班级中年龄第二大的同学
find().sort({age:-1})[1]
find().sort({age:-1}).skip(1).limit(1)
13. 找到班级中年龄最小的三位女生
find({sex:'w'}).sort({age:1}).limit(3)
三. 修改操作
1. 格式对比
mysql:update table set ... where ...
mongo: db.collection.updateOne(query,update,upsert)
2. 修改函数
updateOne(query,update,upsert)
功能: 修改第一个符合条件文档
参数: query 筛选条件 同 find
update 要修改的数据,需要同修改操作符一 起使用
upsert 如果query没有筛选到文档是否插入 新的文档
update 键值对文档,表达将数据修改为什么样子
e.g. 将tom年龄修改为16
db.class0.updateOne({name:'Tom'},{$set:{age:16}})
upsert 如果设置为true,此时query没有筛选到文档会根据前两个参数插入新的文档
e.g. 如果没有Levi则插入新的文档
db.class0.updateOne({name:'Levi'},{$set:{age:21}},{upsert:true})
updateMany(query,update,upsert):
功能: 修改所有符合条件的文档
参数: 同 updateOne
e.g. 修改age域为字符串的年龄改为18
db.class0.updateMany({age:{$type:2}},{$set:{age:18}})
update(query,update,upsert,multi)
功能: 修改文档
参数:query update 用法同 updateOne
upsert upsert=true 表示查找不到文档则插入新的文档
multi 默认只修改一个文档 ,multi=true
表示修改所有符合条件文档
e.g. 修改jack年龄16,如果不存在则插入,如果存在多个则全部修改
db.class0.update({name:'Jack'},{$set:{age:16}},true,true)
findOneAndUpdate(query,update)
功能: 查找到一个文档并修改
参数: query 查找条件
update 修改数据
返回值 : 修改前的文档
e.g. 查找到Emma 并修改其年龄为19
db.class0.findOneAndUpdate({name:'Emma'},{$set:{age:19}})
findOneAndReplace(query,doc)
功能: 查找一个文档并替换之
参数:query 查找条件
doc 新的文档
返回: 返回原文档
e.g. 查找lily文档并替换之
db.class0.findOneAndReplace({name:'Lily'},{name:'Jame',age:17,sex:'m'})
3. 修改操作符(修改器)
【1】 $set: 修改一个域的值或者增加一个域
e.g. 修改Levi sex域为'm',如果没有这个域会自动增添
db.class0.updateOne({sex:{$exists:false}},{$set:{sex:'m'}})
* 一个修改器可以同时修改多项
【2】 $unset: 删除一个域
e.g. 删除lucy的sex域
db.class0.updateOne({name:'Lucy'},{$unset:{sex:''}})
【3】 $rename : 给域重命名
e.g. 给sex域 重命名为gender
db.class0.updateMany({},{$rename:{sex:'gender'}})
【4】 $setOnInsert : 如果使用update*执行了插入文档操作,则作为插入的内容
e.g. 如果执行了插入文档则setOnInsert内容也会插入
db.class0.updateOne({name:'Daivl'},{$set:{age:18},$setOnInsert:{gender:'m'}},{upsert:true})
* update参数可以使用多个修改器