目录
复习:
非关系型数据库和关系型数据库比较
- 不是以关心模型构建的,结构自由
- 非关系型数据库不保证数据的一致性
- 非关系型数据库可以在处理高并发和海量数据时弥补关系型数据库的不足
- 非关系型数据库在技术上没有关系型数据库成熟也没有sql语句操作
mongodb 文档型数据库
- 创建数据库:use databaseName
- 删除数据库:db.dropDatabase()
- 创建集合:db.createCollection()
db.collection.insert() - 删除集合:db.collection.drop()
- 重命名集合:db.collection.renameCollection(new_name)
db.getCollection() - 查看数据库:show dbs
- 查看集合:show tables
show collections - 插入文档:insert() save()
day02
查找操作
- mysql 和 mongo对比
- mysql : select * from table where ….
- mongo : db.collection.find(query,field)
- find(query,field)
- 功能:查找数据
- 参数:
query筛选条件,相当于where子句
field选择要展示的域 - 返回值:返回要查找的文档
- 查找所有内容
db.collection.find()--->select * from tabls - query:以键值对的形式给出查找条件
e.g.:db.class0.find({name:'Lucy'}) - field:以键值对的形式给出要展示(不展示)的域
域名为键,0为值表示不显示该域,1为值表示显示该域
* 如果某个域设置为0则表示不展示该域其他的均展示
* 如果某个域设置为1则表示展示该域其他的均不展示
* _id必须设置为0才不会显示
* 除了_id其余设置的值必须相同
*如果不写该参数,则表示显示所有内容
e.g.:db.class1.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 | 等于 | db.class1.find({age:{$eq:13}},{_id:0}) db.class1.find({age:13},{_id:0}) |
$lt | 小于 < | 年龄小于15:
字符串也可以比较大小 |
$lte | 小于等于 <= | 小于等于15:db.class1.find({age:{$lte:15}},{_id:0}) |
$gt | 大于 > | 大于15:db.class1.find({age:{$gt:15}},{_id:0}) |
$gte | 大于等于 >= | 大于等于15: db.class1.find({age:{$gte:15}},{_id:0}) |
$ne | 不等于 != | 不等于13:db.class1.find({age:{$ne:13}},{_id:0}) |
$in | 包含 | 年龄包含 在11,12,13,14的:db.class1.find({age:{$in:[11,12,13,14]}},{_id:0}) |
$nin | 不包含 | 年龄不是13,14:db.class1.find({age:{$nin:[13,14]}},{_id:0}) |
逻辑操作符
query中如果多个条件用逗号隔开即为and关系
- e.g. 年龄大于13 小于16
> db.class1.find({age:{$gt:13,$lt:16}},{_id:0})
- e.g. 年龄大于13且性别为女
> db.class1.find({age:{$gt:13},sex:'w'},{_id:0})
符号 | 含义 | 例子 |
---|---|---|
$and | 逻辑与 | 年龄大于13 :并且姓名大于Lily db.class1.find({$and:[{age:{$gt:13}},{name:{$lt:'Lily'}}]},{_id:0}) |
$or | 逻辑或 | 年龄大于15或者为男生:db.class1.find({$or:[{age:{$gt:15}},{sex:'m'}]},{_id:0}) |
$not | 逻辑非 | 年龄不大于15:db.class1.find({age:{$not:{$gt:15}}},{_id:0}) |
$nor | 既不也不 | 既不大于16 也不是女生:db.class1.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0}) |
条件混合
- 年龄大于30并且叫阿宝或者性别为w
db.class1.find({$or:[{age:{$gt:30},name:'阿宝'},{sex:'w'}]},{_id:0}) - 年龄小于30或者大于33,并且性别为女
db.class1.find({$and:[{$or:[{age:{$lt:30}},{age:{$gt:33}}]},{sex:'m'}]},{_id:0})
db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'m'},{_id:0})
数组
表达:使用中括号将一定的数据组织成一种数据结构
- 数组中的数据类型可以不同
- 数组是有序的
e.g.:数组值中只要有任意一项大于90即可db.class2.find() { "_id" : ObjectId("5b7a3ca3e474620ab42e819e"), "name" : "小红", "age" : 9, "score" : [ 92, 79, 88 ] } { "_id" : ObjectId("5b7a3d53e474620ab42e819f"), "name" : "小明", "age" : 9, "score" : [ 77, 69, 58 ] } { "_id" : ObjectId("5b7a3d83e474620ab42e81a0"), "name" : "小刚", "age" : 8, "score" : [ 87, 98, 88 ] } { "_id" : ObjectId("5b7a3dade474620ab42e81a1"), "name" : "小丽", "age" : 10, "score" : [ 97, 85, 79 ] } > db.class2.find({score:{$gt:90}},{_id:0}) { "name" : "小红", "age" : 9, "score" : [ 92, 79, 88 ] } { "name" : "小刚", "age" : 8, "score" : [ 87, 98, 88 ] } { "name" : "小丽", "age" : 10, "score" : [ 97, 85, 79 ] }
符号 | 含义 | 例子 |
---|---|---|
$all | 查找数据中同时包含多项 | 同时包含97 79:db.class2.find({score:{$all:[97,79]}},{_id:0}) |
$size | 通过数组元素个数查找 | db.class3.find({score:{$size:3}},{_id:0}) |
$slice | 取出数组的部分进行显示 放在field中 | 显示数组中前两项: 跳过第一项显示后面二项: |
其它query查询
符号 | 含义 | 例子 |
---|---|---|
$exists | 判断一个域是否存在 | 查找存在sex域的文档:
, true 表示有这个域 false表示筛选无这个域 |
$mod | 余数查找 | 查找除以2余数为1的: db.class2.find({age:{$mod:[2,1]}},{_id:0}) |
$type | 找出值为指定类型的文档 | 查找age数据类型为1的文档(1代表double类型) db.class1.find({age:{$type:1}},{_id:0}) 查找name字符类型为2的文档(2代表字符类型) db.class2.find({name:{$type:2}},{_id:0}) |
操作符用法文档查找
www.mongodb.com --> docs --> search
查找结果的进一步操作
符号 | 含义 | 例子 |
---|---|---|
distinct() | 功能:查看集合某个域的取值范围 | 查看集合中age域值的范围:db.class1.distinct("age") |
pretty() | 功能: 格式化显示查找结果 | db.class1.find().pretty() |
limit(n) | 功能: 显示查找结果的前n条 | 显示查找结果的前三条 :db.class1.find({},{_id:0}).limit(3) |
skip(n) | 功能 : 跳过前n条显示 | 跳过前三条显示后边的内容:db.class1.find({},{_id:0}).skip(3) |
count() | 功能 : 计数统计 | 统计男生数量:db.class1.find({sex:'m'},{_id:0}).count() |
sort({field:1/-1}) | 功能 : 对查找结果排序, 参数 : 以键值对的形式给出, 1 表示按照升序排序, -1表示降序排序 | 按照年龄升序:db.class1.find({},{_id:0}).sort({age:1}) |
复合排序 | 当第一排序项相同时比较第二排序项,以此类推 | db.class1.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)
-
功能:删除文档
-
参数:
query筛选要删除的文档,相当于where,用法同查找
justOne 布尔值,默认为false,表示删除所有符合条件的文档,如果是true,只删除第一条符合条件的文档 -
e.g.:删除年龄域不是数字类型的
db.class1.remove({age:{$not:{$type:1}}}) -
e.g.:删除第一个年龄为17的文档
db.class1.remove({age:17},true)
-
-
删除一个集合中所有文档
db.collection.remove({})-
e.g.:删除class2中所有文档
db.class2.remove({})
-
-
练习:
-
创建数据库 名字grade
use grade -
数据库中创建集合 名字 class
-
集合中插入若干文档格式如下
{name;'zhang',age:10,sex:'m',hobby:['a','b'...]}
年龄在4-13岁之间
hobby 几项都可以,可选项:draw sing dance basketball football pingpong running computer
db.class.insert({name:'zhang',age:10,sex:'m',hobby:['a','b'...]})
-
-
查询练习:
-
查看班级所有人信息
db.class.find() -
查看年龄大于10岁的学生信息
db.class.find({age:{$gt:10}}) -
查看年龄8-11岁之间的学生信息
db.class.find({age:{$gt:8,$it:11}}) -
找到年龄9岁且为男生的学员
db,class.find({age:9,sex:'m'}) -
找到年龄小于7岁或者大于11岁的学生
db.class.find({$or:[{age:{$it:7}},{age:{$gt:7}}]},{_id:0}) -
找到年龄7岁或者11岁的学生
db.class.find({age:{$in:[7,11]}}) -
找到有两项兴趣爱好的学生
db.class.find({hobby:{$size:2}}) -
找到喜欢computer学生
db.class.find({hobby:'computer'}) -
找到既喜欢画画,又喜欢跳舞的学生
db.class.find({hobby{$all:['draw','dance']}}) -
统计兴趣爱好有3项的学生人数
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) -
删除所有年龄小于6岁或者大于12岁的学员
db.class.remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]})
-
修改操作
- mysql格式:update table set … where …
-
mongodb格式:db.collection.update(query,update,upsert,multi)
-
功能:修改文档
-
参数:
1,query: 筛选要修改的文档,相当于where,用法同查找
2,update: 将筛选的文档修改为什么内容,相当于set,需要配合修改操作符一同使用
3,upsert: bool值,默认false,如果query的文档不存在则不进行任何操作,如果设置为true则如果query的文档不存在就根据query和update插入新文档
4,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)
-
作业:
- 练习查找,删除操作,记忆操作符使用,回顾文档的查找方法
- 回顾文档的查找方法
- 将课上练习再进行熟练