MongoDB数据库
# MongoDB的基本概念
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,也就是说它本质上是一个NoSQL数据库
它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
# 1、管理逻辑库
逻辑库相当于MySQL的数据库。
- 创建/切换逻辑库:
use test - 查看逻辑库:
show dbs - 删除逻辑库:
db.dropDatabase()
# 2、管理集合
集合相当于MySQL的表。
- 创建集合:
db.createCollection("集合名") - 查看集合列表:
show collections - 删除集合:
db.集合.drop() - 查看集合中记录数量:
db.集合.count() - 查看数据空间容量:
db.集合.dataSize() - 重命名集合:
db.集合.renameCollection("")
添加记录:
db.student.save([
{name:"zhangsan",age:19},
{name:"lisi",age:20},
{name:"王昭",age:20},
])
2
3
4
5
# 3、MongoDB中的主键
在集合中,文档之间都是松散,没有统一的字段约束。为了标识文档的唯一性,MongoDB为每个文档都添加了主键字段( id)。
这个主键中包含着添加的时间戳,MongoDB存储日期都会自动转换成格林尼治时间,ObjectID字段并包含了时间戳,可以提取出记录保存的时间。
ObjectId("63b94be24f1471e8e49de408").getTimestamp() // 返回:ISODate("2023-01-07T10:39:30Z")
# MongoDB中的查询操作
MongoDB中的查询和MySQL有很大的不同,MongoDB只支持单表查询,但是能够完成很复杂的查询操作,这些查询都是JSON格式的,因此和sql语句有着很大的不同。
# 1、查询函数find
db.student.find({age: 20}) // 找age=20的记录
db.student.find({age: {$gte: 20}}) // age>=20
db.student.findOne({age: {$gte: 20}}) // age>=20,返回第一条元素
2
3
上述age>=20使用了特定的表达式来书写的,如下表所示:
| 序号 | 表达式 | 含义 |
|---|---|---|
| 1 | $lt | 小于 |
| 2 | $gt | 大于 |
| 3 | $lte | 小于等于 |
| 4 | $gte | 大于等于 |
| 5 | $in | 包括 |
| 6 | $nin | 不包括 |
| 7 | $ne | 不等于 |
# 2、查询函数中的表达式
下面四种表达式要略微复杂些。
| 序号 | 表达式 | 意义 |
|---|---|---|
| 1 | $all | 全部 |
| 2 | $not | 全部取反 |
| 3 | $or | 或 |
| 4 | $exists | 含有字段 |
db.teacher.save([
{name:"Jack",role:["班主任","年级主任","副校长"]},
{name:"Nick",role:["班主任"]},
])
// 查询同时有["班主任","年级主任"]的数据
db.teacher.find({role:{$all:["班主任","年级主任"]}})
// 查询年龄在28-30岁之间的学生
db.student.find({age:{$not:{$gte:28,$lte:30}}})
// 查询30岁以下的男学生,或者25岁以下的女学生
db.student.find({$or:[
{age:{$lt:30},sex:"男"},
{age:{$gt:25},sex:"女"}
]})
// 查询含有city字段的学生
db.student.find({city:{$exists:1}})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 3、正则表达式
MongoDB支持正则表达式查找数据
db.student.find({name:/^李/}) // 查询姓李的同学记录
db.student.find({name:/^[a-zA-Z]{2,10}$/}) // 查询姓名是英文,且字符在2-10的同学记录
2
# 4、分页查找数据
db.student.find().limit(10)
db.student.find().skip(20).limit(10) // 从第20条开始,往后取10条
2
# 5、分页查找数据
db.student.find().limit(10)
db.student.find().skip(20).limit(10) // 从第20条开始,往后取10条
2
# 6、数据排序
sort函数可以对结果集进行排序,1代表升序,-1代表降序
db.student.find().sort({name: 1})
# 7、去重
用distinct()函数替代find()函数查找不重复的记录。
db.student.distinct("name")
# MongoDB中的修改与删除
MongoDB可以根据条件修改或删除,这个条件语句和查询中的一样,其中修改也同样支持一些复杂的操作,比如字段值的加法运算,向数组添加元素等等。
# 1、MongoDB的修改
update()和updateMany()函数能实现对记录的修改,update()修改一条记录而updateMany()能修改多条记录。
db.collection.updateMany({查询条件},{$set:{data}}) // 基本使用格式
// 修改找到的第一条姓名等于李强的记录,修改age字段为26,classno字段为2-6
db.student.update({name:"李强"},{$set:{age:26,classno:"2-6"}})
// 修改性别为男且年龄大于等于25的记录,classno字段为2-6
db.student.updateMany(
{sex:"男", age:{$gte:25}},
{$set:{classno:"2-6"}}
)
2
3
4
5
6
7
8
9
$set是修改属性值,如果不存在则会自动添加,而$unset可以删除记录中的字段,案例如下:
db.student.update({name:"李强"},{$unset:{city:1,tel:1}})
$inc:对某个字段值做加法运算
db.student.update({},{$inc:{age:2}}) // 对age属性加上2
$push:向数组属性添加元素
$pull:可以删除数组属性的元素
db.teacher.update({name:"Jack"}, {$push:{role: "教导主任"}})
db.teacher.update({name:"Jack"}, {$pull:{role: "副校长"}})
2
# 2、MongoDB的删除
删除就很简单了,remove()函数可以删除记录
db.student.remove({sex:"男"}) // 删除所有男学生
# MongoDB中的索引
MongoDB支持索引,在数量很大的集合中必须创建索引,不然进行查询操作筛选数据时都要进行全表扫描,那样就太慢了。
因为创建索弓|的过程会阻塞MongoDB,影响其他增删改查操作,所以background参数代表在空闲的时候创建索引。升序为1降序为-1
db.student.createIndex({name: 1},{background: true})
db.student.getIndexs()
2
# 1、唯一性索引
唯一性索引只能创建在每个记录都含有的公共字段上,在非公共字段是不能创建唯一性索引的。
db.student.createIndex({name: 1},{background: true, unique: true})