MongoDB
1 关系型数据库和非关系型数据库
数据库中,事务的四个特性(ACID):
原子性,一致性,隔离性,持久性
数据库的主要分类为 : 关系型数据库和非关系型数据库(NoSQL)
非关系型数据库主要区别于关系型数据库的地方就在于它不保证数据的ACID特性
非关系型数据库的主要代表 :
文档非关系型数据库 : MongoDB
2 MongoDB简述
MongoDB底层使用的JS的语法
它有以下好处:
- 简单直观 : 灵活的文档结构的存储方式,能够更便捷地获取数据
- 性能优越 : 分片架构
- 结构灵活 : JSON结构
- 开发便捷 : 动态模型,意味着更易响应新的业务需求
- 4.0版本后支持事务
MongoDB的应用场景 :
在游戏,直播,日志记录中都有使用到
MongoDB的底层实现原理 :
https://www.jb51.net/article/117764.htm
注意MongoDB属于半内存数据库,可能会有60s间隔数据丢失
MongoDB中没有主键外键的概念
3 MongoDB的核心概念
SQL中的概念 | MongoDB中的概念 | 对比/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 行/文档 |
column | field | 列/字段 |
index | index | 索引 |
table joins | 无 | MongoDB不支持多表连接 |
primary key | primary key | 主键,在MongoDB中,会自动将 _id 设置为主键 |
注意MongoDB是区分类型和大小写的
且key不允许重复
MongoDB的字段 field 支持以下几种数据类型 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HkPyBGfJ-1596291377880)(…/images/1596280262880.png)]
4 MongoDB的库操作
使用 use 库名 , 如果存在这个库,便会切换到这个数据库,如果不存在,则会创建这个数据库
show dbs: 查询所有数据库
use 数据库名: 创建并且选中数据库,数据库已经存在则直接选中
db: 查询当前选择的数据库
db.dropDatabase(): 删除当前选中的数据库
show collections: 查询当前库中的集合
db.createCollection("集合名"): 创建集合
db.集合名.drop(): 删除集合
注意: db.集合名 == db.getCollection("集合名")
操作情况如下:
5 MongoDB的DML操作
注意 , 在MongoDB的 DML 中,所有的命令都要以 db. 开头
增 :
向集合中新增文档 : 如果集合不存在,就会先创建集合
db.集合名.insert(文档) : 在指定集合中创建一个文档,如果集合不存在先创建集合
db.集合名.find({}) : 查询指定集合中所有文档 / 这里的 {} 加不加都行
在插入一个文档时,集合会自动给文档生成一个 _id 主键字段
// 向user集合中插入一个对象
db.user.insert({name:"张三",age:18})
// 向user集合中插入多个对象
db.user.insertMany([{name:"李四",age:25},{name:"王五",age:22}])
改 :
修改的模板大致如下:
db.集合名.update(
{更新条件,类似于sql中的where后面的内容},
{$set:{更新对象,类似于sql中的set后面的}},
{
upsert:更新对象是否存在,不存在就创建,默认为false不创建
multi:是否更新所有 符合更新条件 的更新对象,默认为false只更新第一个
writeConcern:抛出异常的级别
// 这三个都是可选的
}
)
//把一个带有name=张三,修改其age值为30
db.user.update(
{name:"张三"},
{$set:{age:30}}
)
//修改所有name=张三的文档,修改其name=王二麻子,age=20
db.user.update(
{name:"张三"},
{$set:{name:"王二麻子",age:20}},
{
multi:true
}
)
//修改所有的文档,修改其name=傻子,age=10
db.user.update(
{}, //这行条件也要留着,用于占位
{$set:{name:"傻子",age:10}},
{
multi:true
}
)
注意更新操作中,就算某个条件不需要,那个 {} 也要留着,用于占位
updateOne() 等价于条件 multi=false
updateMany()等价于条件 multi=true
MongoDB中添加列和删除列的操作 :
-
添加列 : 直接set一个不存在的列,该列就被添加进来了
//给所有人添加一个 alive 列 db.user.update( {}, {$set:{alive:"true"}}, { multi:true } )
-
删除列 : 和上面类似,使用的是 unset
//删除刚才添加的 alive 列 db.user.update( {}, {$unset:{alive:""}}, { multi:true } )
删 :
删除的模板大致如下 :
db.集合名.remove(
{删除条件,类似于where后面部分}, // 可选
{
// 可选
justOne:布尔类型 -->是否删除所有符合条件的数据,默认为false
writeConcern -->抛出异常的级别
}
)
//删除_id=xxx的文档
db.user.remove(
{_id:ObjectId("5f255ae21e350000400009b3")}
)
//删除所有带有name=dafei的文档
db.user.remove(
{name:"傻子"},
{
justOne:0
}
)
//删除当前集合中所有文档
db.user.remove(
{}
)
注意这里有个注意点:
删除 _id=xxx 的文档,如果直接将 _id 放上去,删除会没有反应,以json格式查看数据就知道为啥:
这里的 _id 值,实际上还包含了前面的 ObjectId 这个东西,所以要一起加上去才行
6 MongoDB的DQL操作
查询的语法大致如下:
db.集合名.find({查询条件},{列名:布尔值})
其中 : 列名:布尔值 表示,当布尔值为 true 时,查询结果显示该列
//查所有用户的所有数据
db.users.find()
//查询姓名为cai xv kun 的用户的年龄
db.users.find(
{name:"cai xv kun"},
{_id:0,age:1}
)
排序:在 查询末尾添加 sort() 函数,sort() 中写排序条件, key:value形式,value为布尔值**
//查询所有用户按年龄排序
db.users.find().sort(
{age:1}
)
*分页 : 在查询末尾添加 .skip(a).limitb(b) 函数 , 其中 a 相当于 (currentPage-1)pagesize , b 相当于 pageSize
比较运算符 :
find( { 字段:{ 比较运算符:值 }} )
- 不等于 : $ne ==> not equals
- 大于 : $gt ==> greater than
- 大于等于 : $gte ==> greater than equals
- 小于 : $lt ==> less than equals
- 小于等于 : $lte ==> less than equals
- is null {$exists:true}
- in {$in : [xx,xx,xx,…] }
//查询age > 30的用户
db.users.find(
{age:{$gt:30}}
)
//查询名字为 dafei 或xiaofei用户
db.users.find(
{name:{$in:["dafei","xiaofei"]}}
)
//判断存在有name列的数据
db.users.find(
{name:{$exists:true}}
)
逻辑运算符:
find( {逻辑运算符:[ 条件1, 条件2 ,… ]} )
$and ==> &&
$or ==> ||
$not ==> !
模糊查询:
db.集合名.find ( { 列 : {$regex : / 关键字 / } } ) :
db.users.find(
{
name:{$regex:/fei/} //正则对象
}
)
db.users.find(
{
name:{$regex:"fei"} //正则表达式
}
)
//查name中包含fei字样,并且年龄在28 到 30间的用户信息
db.users.find(
{
$and:[
{name:{$regex:/fei/}},
{age:{$gte:28}},
{age:{$lte:30}}
]
}
)
7 MongoDB中字段的数组操作
给所有数据添加数组字段 :
db.集合名.updateMany(
{},
{
$set:{ 数组名:[] }
}
)
往数组字段中添加数据,有两种添加方式:
$push() : 就算要添加的数据已经添加了,已然继续添加,允许重复;
$addToSet() : 已经存在的数据,就不会再添加 , 不允许重复
注意,对数组而言,一次性添加多个数据时,还要使用 $each() 方法进行添加
注意是先写数组,再写 $each() 方法
//给name等于dafei的用户添加java 爱好
db.users.update(
{name:"dafei"},
{
$push:{hobby:"java"}
}
)
//给name等于dafei的用户添加'java', 'c', 'vue' 爱好
db.users.update(
{name:"dafei"},
{
$addToSet:{
hobby:{$each:["java","c","vue"]}
}
}
)
往数组字段中删除数据 , 也有两种方式:
$pop{} : 1–>删除最后一个 , -1–>删除第一个
$pull{} : 通过指定内容删除
//删除name=dafei用户最后一个兴趣
db.users.update(
{name:"dafei"},
{
$pop:{hobby:1}
}
)
//删除name=dafei用户java兴趣选项
db.users.update(
{name:"dafei"},
{
$pull:{hobby:"java"}
}
)
在数组字段中修改数据 :
支持通过索引修改和通过指定元素修改
//将name=dafei的用户索引为1的兴趣改为 go
db.users.update(
{name:"dafei"},
{
$set:{"hobby.1":"go"}
}
)
//将name=dafei的用户 c 兴趣 改为 c#
db.users.update(
{name:"dafei",hobby:"c"},
{
$set:{"hobby.$":"c#"}
}
)
//数组修改中,通过数组元素修改 , 后面那个 $ 其实就是占位符 , 在找到之后,使用索引来替换 $
//查询兴趣中含有go的用户信息
db.users.find(
{hobby:"go"},
{},
{
multi:true
}
)
在数组字段中修改数据 😗*
支持通过索引修改和通过指定元素修改
//将name=dafei的用户索引为1的兴趣改为 go
db.users.update(
{name:"dafei"},
{
$set:{"hobby.1":"go"}
}
)
//将name=dafei的用户 c 兴趣 改为 c#
db.users.update(
{name:"dafei",hobby:"c"},
{
$set:{"hobby.$":"c#"}
}
)
//数组修改中,通过数组元素修改 , 后面那个 $ 其实就是占位符 , 在找到之后,使用索引来替换 $
//查询兴趣中含有go的用户信息
db.users.find(
{hobby:"go"},
{},
{
multi:true
}
)