MongoDB day02
1、非关系型数据库和关系型数据库比较
1. 不是以关系模型构建的,结构自由
2. 非关系型数据库不保证数据的一致性
3. 非关系型数据库可以在处理高并发和海量数据时弥补关系型数据库的不足
4. 非关系型数据库在技术上没有关系型数据库成熟也没有sql语句的操作
2、mongoDB文档型数据库
创建数据库: use databaseName
删除数据库: db.dropDatabase()
创建集合: db.createCollection() / db.collection.insert()
删除集合: db.collection.drop()
重命名集合: db.collection.renameCollection() / db.getCollection()
查看数据库: show dbs
查看集合: show tables / show collections
插入文档: insert() / save()
3、文档 bson www.mongodb---->docs查看文档帮助
#######################################################################################
查找操作:
mysql: select ... fron table where ...
mongo: db.collection.find(query,field)
参数:query 筛选条件,相当于where字句(键值对)
field 选择要展示的域(键值对)
db.collection.find() ----》select * from table
query:以键值对的形式给出查找条件
e.g. db.class0.find({name:'Lucy'})
field: 以键值对的形式给出要展示(不要展示的域)
域名为键,0为值表示不显示该域;1为值表示显示该域
e.g. db.stu.find({},{_id:0})
* 如果使用0设置某些域不显示则默认其他域显示;如果使用1设置某些域显示则默认其他域不显示
* ——ID比较特殊,只有设置为0才不显示否则默认显示,
* 除了ID域,其他的域必须同时设置为0或者1
* 如果不写改参数,则默认显示所有内容
e.g. db.stu.find({sex:'m'},{_id:0,name:1,age:1})
findOne(query,field)
功能:查找符合条件的第一条文档
参数:同find
返回值:查找到的文档
e.g. db.class0.findOne({age:17},{id:0}) # 只显示第一条文档
query更丰富的用法
操作符;使用$号注明的第一个特殊意义字符串,表达某个特定含义,比如$gt表示大于
比较操作符
$eq 等于 e.g. db.stu.find({age:{$eq:18}},{_id:0})
$lt 小于 e.g. db.stu.find({age:{$lt:28}},{_id:0})
字符串也能进行比较 e.g. db.class0.find({name:{$lt:'Tom'}},{_id:0})
$lte 小于等于 <= db.stu.find({age:{$lte:27}},{_id:0})
$gt 大于 > db.class0.find({age:{$gt:17}},{_id:0})
$gt 大于等于 >= db.class0.find({age:{$gte:17}},{_id:0})
$ne 不等于 != e.g. db.class0.find({age:{$ne:17}},{_id:0})
$in 包含 e.g.查找年龄在[16 18]中的 db.class0.find({age:{$in:[16,18]}},{_id:0})
$nin 不包含 e.g. 不是16 17的都找到 db.class0.find({age:{$nin:[16,17]}},{_id:0})
逻辑操作符
$and 逻辑与
* query 中如果多个条件用逗号隔开即为and关系
e.g.年龄为17并且为男 db.class0.find({age:17,sex:'m'},{id:0})
e.g.年龄大于13并且小于18 db.class0.find({age:{$gt:13,$lt:18}},{_id:0})
$or 逻辑或
e.g. 年龄大于30或性别为女 db.class1.find({$or:[{age:{$gt:30}},{sex:'w'}]},{_id:0})
$not 逻辑非
年龄不等于17 db.class0.find({age:{$not:{$eq:17}}},{_id:0})
$nor 既不也不
e.g. 查找年龄不等于17,性别不为男的 db.class0.find({$nor:[{age:17},{sex:'m'}]},{_id:0})
条件混合
(年龄大于30 并且叫阿宝) 或者 性别为 w db.class1.find({$or:[{age:{$gt:30},name:'阿宝'},{sex:'w'}]},{_id:0})
(年龄小于30或者大于33) 并且 性别为 w db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'w'},{_id:0})
数组
表达 : 使用中括号将一定的数据组织成一种数据结构
* 数组是有序的;数组中的数据类型可以不同
e.g. 数组值中只要有任意一项大于90即可 db.class2.find({score:{$gt:90}},{_id:0})
$ size 通过数组中元素的个数查找
e.g. 查找数组中包含两项的文档 db.class2.find({score:{$size:2}},{_id:0})
$all 查找数组中同时包含多项的文档
e.g. 数组中同时包含88和90 db.class2.find({score:{$all:[88,90]}},{_id:0})
$slice 取数组的部分进行显示,在field中声明
e.g. 显示数组中前两项 db.class2.find({},{_id:0,score:{$slice:2}})
e.g. 跳过第一项显示后面两项 db.class2.find({},{_id:0,score:{$slice:[1,2]}})
其他query查询
$exixts
判断一个与是否存在
e.g. 查找有sex域的文档(true表示存在,false表示不存在) db.class0.find({sex:{$exists:true}},{_id:0})
$mod 余数查找
e.g. 除以2余1的 db.class0.find({age:{$mod:[2,1]}},{_id:0})
$type 数据类型查找
e.g. 查找age值类型是1的 db.class1.find({age:{$type:1}},{_id:0})
操作符用法文档查找
www.mongodb.com ---> docs ---->search
查找结果的进一步操作
distinct() 查看集合中某个域的取值范围
e.g. 查看年龄的取值范围 db.class1.distinct('age')
pretty() 将查询结果格式化显示
e.g. db.class1.find().pretty()
limit(n) 显示查找结果的前n条文档
e.g. 显示查找到的文档的前3条 db.class1.find({},{_id:0}).limit(3)
skip(n) 跳过前n条显示后面的内容
e.g. 跳过查找到的前三条,显示后面的内容 db.class1.find({},{_id:0}).skip(3)
count() 计数统计
e.g. 统计查找数量 db.class1.find({},{_id:0}).count()
sort({field:1/-1}) 对查找结果排序
参数 : 以键值对形式给出,键表示按照哪个域排序;1表示升序,-1表示降序
e.g. 对查找结果按照年龄升序排序 db.class1.find({},{_id:0}).sort({age:1})
复合排序: 当第一排序项相同的时候按照第二排序项排序,以此类推
e.g. 当年龄相同时,按照姓名进行排序 db.class0.find({},{_id:0}).sort({age:1,name:1})
函数的连续调用
当一个函数的返回结果仍然是文档集合的时候可以连续调用函数
e.g. 查看年龄最小的三个文档 db.class1.find({},{_id:0}).sort({age:1}).limit(3)
文档删除操作
mysql : delete from table where ...
mongodb : db.collection.remove(query,justOne)
remove(query,justOne) 删除文档
参数 : query 筛选要删除的文档,相当于where;用法同 查找
justOne 布尔值
默认为False 表示删除所有复合条件的文档;如果设置为true 则表示只删除第一条复合条件文档
e.g. 删除年龄域值不是数字类型的 db.class1.remove({age:{$not:{$type:1}}})
e.g. 删除第一个年龄为17的文档 db.class0.remove({age:17},true)
删除一个集合中所有文档 db.collection.remove({})
e.g. 删除class0中所有文档 db.class0.remove({})
练习:
1、创建数据库 名字 grade use grade
2、数据库中创建集合 名字 class
3、集合中插入若干文档格式如下
{name:'zhang',age:10,sex:'m',hobby:['a','b'......]}
年龄在4-13之间
hobby几项都可以,可选项:draw sing dance baskeball dootball pingpong running computer
db.class.insert({name:'zhang',age:10,sex:'m',hobby:['a','b'...]})
4、查询练习
查看班级所人信息 find()
查看年龄大于10岁的学生信息 find({age:{$gt:10}})
查看年龄 8-11 岁之间的学生信息 find({age:{$gt:8,$lt:11}})
找到年龄9岁且为男生的学员 find({age:9,sex:'m'})
找到年龄小于7岁或者大于11岁的学生 find({$or:[{age:{$gt:11}},{age:{$lt:7}}]})
找到年龄8岁或者11岁的学生 find({age:{$in:[8,11]}})
找到有两项兴趣爱好的学生 find({hobby:{$size:2}})
找到喜欢computer的学生 find({hobby:"computer"})
找到既喜欢画画,又喜欢跳舞的学生 find({hobby:{$all:['draw','dance']}})
统计兴趣爱好有3项的学生人数 find({hobby:{$size:3}}).count()
找到本班年龄第二大的学生 find({}).sort({age:-1}).skip(1).limit(1)
查看学生学生兴趣爱好的范围 db.class.distinct('hobby')
找到年龄最小的三个同学 find({}).sort({age:1}).limit(3)
删除虽有年龄小于6岁或者大于12岁的学员 remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]})
修改操作
mysql : update table set ... where ...
mongodb : db.collection.update(query,update,upsert,multi)
功能 : 修改文档
参数 : query 筛选要修改的文档,相当于where用法同查找
update :将筛选的文档修改为什么内容,相当于set。 需要配合修改操作符一同使用
upsert : bool值,默认为false。如果query的文档不存在则不进行任何操作
如果设置为true则如果query的文档不存在就根据query和update插入新文档
multi : bool值,默认为false。如果query文档有多条则只修改第一条
如果设置为true 则修改所有符合条件文档
e.g. 将小白年龄改为31 db.class1.update({name:'小白'},{$set:{age:31}})
e.g. 修改文档,如果文档不存在则插入 db.class1.update({name:'阿蓉'},{$set:{age:29}},true)
e.g. 如果有多个年龄小于32的则全部修改 db.class1.update({age:{$lt:32}},{$set:{age:28}},false,true)
作业:练习查找、删除操作、记忆操作符使用;回顾文档的查找方法;将课上练习再进行熟练。