前情回顾:
1.关系型数据库和非关系型数据库的比较
*不是关系模型构建的数据结构,不保证数据的一致性,结构更加灵活自由
*非关系型数据库弥补了关系型数据库在处理高并发存储时读写效率低的问题
*非关系型数据库种类多样,技术不如关系型数据库成熟,没有统一的操作语句,处于不断发展更新阶段
2.mongodb特点 ,安装,基本设置
3.创建数据库
use database
db.dropDatabase() 删除数据库
show dbs 查看数据库
mongodump 备份
mongorestore 恢复
mongostat 数据库监测
mongotop 数据库读写时长
4.集合操作
db.createCollection() 创建集合
db.collection.insert() 创建集合
db.getCollection() 获取集合对象
db.collection.renameCollection() 集合重命名
show collections/tables 集合查看
5.插入文档
insertOen()
insertMany()
insert()
save()
6.查找操作
find(query,filed)
findOne()
-----------------------------------------------------------------------
query的筛选功能
操作符:使用$符号注明的一个有特殊意义的字符串,用以表达丰富的含义
比如:$lt 表示小于
比较操作符:
$eq 等于 =
年龄等于17
db.class0.find({age:{$eq:17}},{id:0})
$lt 小于
年龄小于17
db.class0.find({age:{$lt:17}},{id:0})
姓名小于Tom(字符串也可以比较大小)
db.class0.find({name:{$lt:'Tom'}},{id:0})
$gt 大于
db.class0.find({age:{$gt:20}},{id:0})
条件文档中可以有多个键值对,多个键值对为并,且关系
db.class0.find({age:{$gt:16,$lt:19}},{_id:0})
$lte 小于等于 <=
$gte 大于等于 >=
$ne 不等于 !=
$in 包含
查找年龄等于16或18或20的文档
db.class0.find({age:{$in:[16,18,20]}},{_id:0})
$nin 不包含
db.class0.find({age:{$nin:[17,19,21]}},{_id:0})
逻辑操作符
表示逻辑与
1.在query文档中逗号隔开的多个键值对即表示与关系
年龄等于17,性别为女
db.class0.find({age:17,sex:'w'},_id:0)
2.$and 表示逻辑与
db.class0.find({$and:[{age:17},{sex:'w'}]},{_id:0})
3.表示逻辑或 $or
年龄小于17,或者性别为女
db.class0.find({$or:[{age:{$lt:17}},{sex:'w'}]},{_id:0})
4.表示逻辑非 $not
db.class0.find({age:{$not:{$gt:17}}},{_id:0})
5.表示逻辑 既不也不 $nor not (A or B)
既不是男的年龄不大于18
db.class0.find({$nor:[{sex:'m'},{age:{$gt:18}}]},{_id:0})
练习: 条件混合
年龄大于18或者小于17,并且要求性别为女
db.class0.find({$or:[{age:{$gt:18}},{age:{$lt:17}}],sex:'w'})
年龄大于等于17的男性获者姓名为王八蛋
db.class0.find($or:[{age:{$gte:17},sex:'m'},{name:'王八蛋'}],{_id:0})
数组类型查找
数组:一组数控的有序集合,使用[]表示
*有序的
*数据类型不相同
查找数组中包含某一项
e.g. 查找soore 数组中包含90的文档
db.class3.find({score:90},{_id:0})
查找数组中同时包含多项 $all
查找score数组中同时包含78,90的文档
db.class3.find({score:{$all:[78,90]}},{_id:0})
根据数组项数查找 $size
db.class3.find({score:{$size:3}},{_id:0})
选择数组的查询部分 $slice
e.g. 显示数组的前两项
db.class3.find({name:'小白'},{_id:0,score:{$slice:2}})
跳过数组第一项显示后面两项
db.class3.find({name:'小白'},{_id:0,score:{$slice:[1,2]}})
其他查找操作符
$exists 判断一个域是否存在,
db.class0.find({sex:{$exists:false}},{_id:0})
$mod 通过除数余数筛选文档
db.class0.find({age:{$mod:[2:1]}},{_id:0})
$type 根据数据类型筛选
查找name数据类型为'2'的文档, 代表字符串
db.class0.find({name:{type:2}},{_id:0})
double:1
string:2
*可以通过查看www.mongodb.com下的docs文档查找新的操作符使用方法
数据处理函数
db.collection.distinct(filed)
功能:获取集合中某个域取值范围
查看class0中age域的取值范围
db.class0.distinct('age')
pretty()
功能:将find查找结果格式化显示
limit(n)
功能:限制显示前n条文档
显示查找结果前三条文档
db.class0.find({},{_id:0}).limit(3)
skip(n)
功能:跳过前n条文档,显示后面的文档内容
跳过查找结果前3条内容显示后端的文档内容
db.class0.find.skip(3)
count()
功能:对查找结果进行统计
统计年龄等于17的文档(使用count query参数要筛选条件)
db.class0.find({age:17},{_id:0}).count()
sort({filed:1/-1})
功能:对查找结果按照指定的域排序显示 1升序 -1降序
按年龄升序排列
db.class0.find({},{_id:0}).sort({age:1})
*复合排序:对多个域进行排序,当第一排序项相同时,参考第二排序项排序,依次类推
db.class0.find({},{_id:0}).sort({age:1,name:1})
函数可以连续调用
查找年龄最大的三位同学文档信息
db.class0.find({},{id:0}).sort({age:-1}).limit(3)
*对筛选的文档集合,可以使用索引序号取某一项
通过序列号1取到筛选结果的第二项
db.class0.find({},{_id:0}).sort({age:-1})[1]
文档删除操作
mysql: delete from table where ...
mongo: db.collection.deleteOne(query)
功能:删除符合条件的第一个文档
参数:筛选条件 用法同find query
删除第一个性别为男的文档
db.class1.deleteOne({sex:'m'})
db.collection.deleteMany(query)
功能:删除所有符合条件就的文档
参数:筛选条件 用法同find query
db.class2.deleteMany({sex:'m'})
*如果筛选条件为空则表示删除集合中所有文档
db.collection.remove(query,justOne)
功能:删除文档
参数:query 筛选条件 用法同find query
justOne 默认为false 此时remove用法同deleteMany
如果为True,此时remove用法同deleteOne
删除第一个年龄为17岁的一个文档(当第二个参数为false时表示删除所有符合条件文档)
db.class0.remove({age:17},true)
db.collection.findOneAndDelete(query)
功能:查找某个文档并删除
参数:query
返回:显示出查找到的文档
查找不存在sex域的文档
db.class0.findOneAndDelete({sex:{$exists:false}})
练习:
1创建数据库 名字grade
2.在数据库中创建集合class
3.在集合中插入数据若干(8条左右)格式如下
{name:xxx,age:10,sex:'m',hobby:['draw','dance']}
年龄7-14
hobby :draw dance running sing football basketball computer
4.查找练习
查看班级所有人信息
db.class.find({},{_id:0})
查看班级中年龄为9岁的人员信息
db.class.find({age:9},{_id:0})
查看年龄大于10岁的学生信息
db.class.find({age:{$gt:10}},{_id:0})
查看年龄在8-12岁的学生信息
db.class.find({age:{$gt:8,$lt:12}},{_id:0})
查看年龄为9岁且喜欢画画的女生
db.class.find({age:9},{sex:'w'},{hobby:'draw'},{_id:0})
查看年龄小于8岁或大于12岁的学生
db.class.find({$or:[{age:{$gt:12}},{age:{$lt:8}}]})
找到年龄为9岁或者11岁的学生
db.class.find({age:{$in:[9,11]}},{_id:0})
找到有两项爱好的同学
db.class.find({hobby:{$size:2}})
找到兴趣爱好有计算机的同学
db.class.find({hobby:'computer'})
找到即喜欢画画也喜欢跳舞的同学
db.class.find({hobby:{$all:['draw','dance']}})
同学兴趣爱好有三项的学生人数
db.class.find(hobby:{size:3}).count()
找到本班年龄第二大的同学
db.class.find().sort(age:-1).skip(1).limit(1)
查看本班同学兴趣爱好的涵盖范围
db.class.distinct('hobby')
找到本班年龄最小的三个同学
db.class.find().sort({age:1}).limit(3)
删除所有年龄大于12或者小于8岁的同学
deleteMany({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
---------------------------------------------------------------
修改文档
mysql: update table set ... where ...
mongo : db.collection.updateOne(query,update,upsert)
功能:修改第一个符合条件的文档
参数:query 筛选条件 用法同find
update 要修改的数据项,需要和修改操作符一同使用
upsert bool 默认为false 表示如果query没有筛选到文档,则不做任何操作
如果设置为true,则如果没有筛选到文档,会根据query update插入新的文档
将年龄17的第一个文档修改为年龄18
db.class0.updateOne({age:17},{$set:{age:18}})
如果query不存在,则会插入新文档
db.class0.updateOne({name:'Jine'},{$set{age:18}},{upsert:true})
db.collection.updateMany(query,update,upsert)
功能:修改所有符合条件的文档
参数:参数用法同updateOne
修改所有年龄为17的文档为年龄20
db.class0.updateMany({age:17},{$set:{age:20}})
db.collection.update(query,update,upsert,multi)
功能:修改筛选文档
参数:query 筛选条件
update 修改内容
upsert 如果为true则如果query文档不存在可以插入新的文档
multi 默认为false 表示只能修改一条文档
设置为True ,表示可以修改多条文档
修改所有不存在sex域的文档年龄为20
db.class0.update({sex:{$exists:false}},{$set:{age:20}},false,true)
db.collection.findOneAndUpdate(query,update)
功能:查找一个文档并修改
参数:query 查找条件
update 修改内容
返回:修改前的文档内容
查找一个文档并修改年龄为17
db.class0.findOneAndUpdate({name:'兔子'},{$set:{age:17}})
db.class0.findOneAndReplace(query,docu)
功能:查找并替换一个文档
参数: query
document:要替换的文档
返回:返回原有文档内容
db.class0.findOneAndReplace({abc:123},{name:'Lily',age:19})
将三国使用mongodb进行构建操作
Mongodb--day02
最新推荐文章于 2024-01-16 23:16:26 发布