MongoDB
简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点
- 高性能
- 易部署
- 易使用
- 非常方便的存储数据
对比MySQL
基本操作
MongoDB的操作有很多,需要掌握更多技能的同学可以查询在线的文档,这里主要是讲这么去学习这个工具
在线文档教程: https://www.runoob.com/mongodb/mongodb-tutorial.html
语法
show dbs: 查询所有数据库
use 数据库名: 创建并且选中数据库,数据库已经存在则直接选中
db: 查询当前选择的数据库
db.dropDatabase(): 删除当前选中的数据库
show collections: 查询当前库中的集合
db.createCollection("集合名"): 创建集合
db.集合名.drop(): 删除集合
注意: db.集合名 == db.getCollection("集合名")
数据类型
在MongoDB中支持以下的数据类型
String(字符串): mongodb中的字符串是UTF-8有效的
Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器
Boolean(布尔): 存储布尔(true/false)值
Double(双精度): 存储浮点值
Arrays(数组): 将数组或列表或多个值存储到⼀个键中
Timestamp(时间戳): 存储时间戳
Object(对象): 嵌⼊式⽂档
Null (空值): 存储Null值
Symbol(符号): 与字符串相同,⽤于具有特定符号类型的语⾔
Date(⽇期): 以UNIX时间格式存储当前⽇期或时间
Object ID(对象ID) : 存储⽂档ID
Binary data(⼆进制数据): 存储⼆进制数据
Code(代码): 将JavaScript代码存储到⽂档中
Regular expression(正则表达式): 存储正则表达式
新增文档
往集合中新增文档,当集合不存在时会自动先创建集合,再往集合中添加文档,但是不要依赖自动创建集合的特性
语法
db.集合名.insertOne( 文档 ) : 往集合中插入一个文档
db.集合名.insertMany([ 文档1, 文档2 ]):往集合中插入多个文档
db.集合名.insert( 文档 ) : 往集合中插入一个文档或者多个
实例
//插入用户对象
db.users.insert({id: 1, name: "小云", age: 20})
//注意:直接写数字默认是Duble类型,其实在使用时是不影响的,仅仅只是类型问题
更新操作
修改集合中已经存在的文档
语法
db.集合名.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,是否要做数据0丢失
简化方法
更新1个:db.集合名.updateOne( ... )
更新所有:db.集合名.updateMany( ... )
实例
//把一个带有name=小云 的文档,修改其age值为18
db.employees.updateOne({name: "逍遥"}, {$set: {age: 30}})
//修改所有name=小云 的文档,修改其name=xiaoyun,age=20
db.employees.updateMany({name: "逍遥"}, {$set: {name: "bunny", age: 30}})
添加列
直接set一个不存在的列即可
db.users.update({age:22}, {$set:{sex:'男'}})
删除列
使用$unset
db.users.update({name:'xiaofei'}, {$unset:{sex:''}})
实例
删除操作
删除集合中的文档
语法
db.集合名.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
简化方法:
删除1个:db.集合名.deleteOne( ... )
删除所有:db.集合名.deleteMany( ... )
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别
实例
//删除_id=xxx的文档
db.users.deleteOne({_id: ObjectId("xxx")})
//删除所有带有name=bunny的文档
db.users.deleteMany({name: "bunny"})
//删除当前数据库中所有文档
db.users.deleteMany({})
查询操作
语法
db.集合名.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)
实例
//查询所有文档
db.users.find({})
排序查询
db.users.find({}).sort({字段: 1}) -> 按照字段升序排列
db.users.find({}).sort({字段: -1}) -> 按照字段降序排列
分页查询
sikp(num): 跳过num个文档,相当于start
limit(num): 限制显示num个文档,相当于pageSize
如:
db.users.find({}).skip(num).limit(num)
第n页:
db.users.find().skip((currentPage-1) * pageSize).limit(pageSize)
需求:按照年龄降序排列,查询第2页,每页显示3个
db.users.find({}).sort({"age":1}).skip(3).limit(3)
比较查询
语法 -> find({字段: {比较操作符: 值, ...}})
比较操作符
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
- (!=) 不等 - $ne
- 集合运算 - KaTeX parse error: Expected '}', got 'EOF' at end of input: …n 如:{name: {in: [“xiaoyao”,“bunny”]}}
- 判断存在 - KaTeX parse error: Expected '}', got 'EOF' at end of input: …s 如:{name: {exists:true}}
逻辑查询
语法 -> find({列:{逻辑操作符: [条件1, 条件2, ...]}})
逻辑操作符
- (&&) 与 - $and
- (||) 或 - $or
- (!) 非 - $not
实例
//查年龄在28 到 30间的用户信息
db.users.find({$and:[{age:{$gte:28}},{age:{$lte:30}}]})
//查看年龄小于28或者年龄大于30用户信息
db.users.find({$or:[{age:{$lte:28}},{age:{$gte:30}}]})
模糊查询
MongoDB的模糊查询使用的是正则表达式的语法 如:{name: {KaTeX parse error: Undefined control sequence: \* at position 11: regex: /^.\̲*̲keyword\.*/}}
实际上MongoDB也是不擅长执行模糊查询的,在实际开发中也是不使用的,该功能了解即可
实例
//查name中包含fei字样,并且年龄在28 到 30间的用户信息
db.users.find({$and: [{name: {$regex: /fei/}}, {age: {$gte: 28,$lte: 30}}]})
数组操作
给所有数据加数组字段
db.users.updateMany({}, {$set:{hobby:[]}})
添加
$push
$push : 给数组字段添加数据, 允许数据元素重复
//给name等于小云的用户添加'java', 'c', 'vue' 爱好
db.users.update({name:'小云'}, {
$push:{hobby:{$each:['java', 'c', 'vue']}}
})
$addToSet
$addToSet: 给数组字段添加数据, 不允许数据元素重复
db.users.update({name:'小云'}, {$addToSet:{hobby:'java'}})
删除
$pop
$pop 删除数组中数据, 1:删除最后一个, -1: 删除第一个
局限: 只能从头或者从尾删除, 不能通过指定元素删除
//删除name=小云 用户最后一个兴趣
db.users.update({name:'小云'},{$pop:{hobby:1}} )
$pull
$pull 删除数组中数据, 通过指定内容删除
//删除name=小云 用户java兴趣选项
db.users.update({name:'小云'}, {$pull:{hobby:'c'}})
修改
方式1: 通过索引修改
//将name=小云的用户索引为1的兴趣改为 go
db.users.update({name:'小云'}, {$set:{'hobby.1':'go'}})
方式2:通过数组元素修改
//将name=小云的用户 c 兴趣 改为 c#
db.users.update({name:'小云', hobby:'c'}, {$set:{'hobby.$':'c#'}})