MongoDB数据库

2023/5/9 语法

# 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},
])
1
2
3
4
5

# 3、MongoDB中的主键

在集合中,文档之间都是松散,没有统一的字段约束。为了标识文档的唯一性,MongoDB为每个文档都添加了主键字段( id)。

这个主键中包含着添加的时间戳,MongoDB存储日期都会自动转换成格林尼治时间,ObjectID字段并包含了时间戳,可以提取出记录保存的时间。

ObjectId("63b94be24f1471e8e49de408").getTimestamp()  // 返回:ISODate("2023-01-07T10:39:30Z")
1

# 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,返回第一条元素
1
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}})
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的同学记录
1
2

# 4、分页查找数据

db.student.find().limit(10)
db.student.find().skip(20).limit(10)  // 从第20条开始,往后取10条
1
2

# 5、分页查找数据

db.student.find().limit(10)
db.student.find().skip(20).limit(10)  // 从第20条开始,往后取10条
1
2

# 6、数据排序

sort函数可以对结果集进行排序,1代表升序,-1代表降序

db.student.find().sort({name: 1})
1

# 7、去重

用distinct()函数替代find()函数查找不重复的记录。

db.student.distinct("name")
1

# 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"}}
)
1
2
3
4
5
6
7
8
9

$set是修改属性值,如果不存在则会自动添加,而$unset可以删除记录中的字段,案例如下:

db.student.update({name:"李强"},{$unset:{city:1,tel:1}})
1

$inc:对某个字段值做加法运算

db.student.update({},{$inc:{age:2}}) // 对age属性加上2
1

$push:向数组属性添加元素

$pull:可以删除数组属性的元素

db.teacher.update({name:"Jack"}, {$push:{role: "教导主任"}})
db.teacher.update({name:"Jack"}, {$pull:{role: "副校长"}})
1
2

# 2、MongoDB的删除

删除就很简单了,remove()函数可以删除记录

db.student.remove({sex:"男"}) // 删除所有男学生
1

# MongoDB中的索引

MongoDB支持索引,在数量很大的集合中必须创建索引,不然进行查询操作筛选数据时都要进行全表扫描,那样就太慢了。

因为创建索弓|的过程会阻塞MongoDB,影响其他增删改查操作,所以background参数代表在空闲的时候创建索引。升序为1降序为-1

db.student.createIndex({name: 1},{background: true})
db.student.getIndexs()
1
2

# 1、唯一性索引

唯一性索引只能创建在每个记录都含有的公共字段上,在非公共字段是不能创建唯一性索引的。

db.student.createIndex({name: 1},{background: true, unique: true})
1