# 一.命令形式
# 1.基本操作
(1)查看数据库
语法:show databases
(2)进入/选择数据库
语法:use 数据库名
注意:选择不存在的数据库不会报错,后期当数据库有数据时,系统会自动创建。
(3)创建数据库
语法:use 数据库名
(4)删除择数据库
步骤一:选择数据库
语法:use 数据库名
步骤二:删除数据库
语法:db.dropDataBase()
# 2.集合基本操作
(1)查看集合
步骤一:选择数据库
语法:use 数据库名
步骤二:查看集合
语法:show collections
(2)创建集合
步骤一:选择数据库
语法:use 数据库名
步骤二:创建集合
语法:db.createCollection('集合名')
(3)删除集合
步骤一:选择数据库
语法:use 数据库名
步骤二:创建集合
语法:db.集合名.drop()
# 3.集合中数据的增
语法:db.集合名.insert(JSON 数据)
- 说明:集合存在,则直接插入数据;集合不存在,隐式创建。插入的 json 数据的键统一不加引号,但查看集合数据时系统自动加。
- 练习:
use test2
db.c1.insert({usename:"test",age:18})
2
# 4.集合中数据的删
语法:db.集合名.remove(条件,[,是删除一条])
说明:是否删除一条:true,是;false,否,默认
练习:
# 删除一条
db.c3.remove({},true)
# 删除全部
db.c3.remove({})
2
3
4
5
# 5.集合中数据的改
(1)基本语法
语法:db.集合名.update(条件,新数据[,是否新增,是否修改多条])
- 说明: 是否新增:指条件匹配不到数据则插入(true 插入;false 不插入,默认) 是否修改多条:指将匹配成功的数据都修改(true 是;false 否,默认)
- 练习:
# 将zs1改为zs2;发现不是修改而是替换
db.test.update({name:"zs1"},{name:"zs2"})
# 这样写才是修改
db.test.update({name:"zs1"},{$set:{name:"zs2"}})
2
3
4
(2)升级语法
语法:db.集合名.update(条件,{修改器:{键:值}})
| 修改器 | 作用 |
|---|---|
| $in | 递增 |
| $rename | 重命名列 |
| $set | 修改列值 |
| $unset | 删除列 |
# 6.集合中数据的查
(1)基本语法
语法:db.集合名.find(条件 [,查询的列])
条件:
查询所有数据 {}或者不写
查询age=6的数据 {age:6}
既要age=6又要性别=男的数据 {age:6,sex:'男'}
查询的列(可选参数)
不写:查询全部列
{age:1}:只显示age列(此时条件也要写上,可写{})
{age:0}:除了age列都显示
不管怎么写,系统自定义的_id都会在
2
3
4
5
6
7
8
9
10
(2)升级语法
语法:db.集合名.find({键:{运算符:值}})
| 运算符 | 作用 |
|---|---|
| $gt | 大于 |
| $gte | 大于等于 |
| $lt | 小于 |
| $lte | 小于等于 |
| $ne | 不等于 |
| $in | in |
| $nin | not in |
# 7.排序
语法:db.集合名.find().sort(JSON 数据)
- 说明:键:要排序的字段/列;值:1,升序;-1,降序
- 练习
# 降序
db.test.find().sort({age:-1})
# 升序
db.test.find().sort({age:1})
2
3
4
# 8.分页
语法:db.集合名.find().sort().skip(数字).limit(数字)
- 说明:skip 跳过指定数量(可选),limit 限制查询的数据;数字:在使用的时候,数字必须是 number 类型,不能为字符串数据等。
- 练习:1.降序查询两条;2.降序跳过 2 条并查询 2 条
# 1
db.test.find().sort({age:-1}).skip(0).limit(2)
# 2
db.test.find().sort({age:-1}).skip(2).limit(2)
# 3.数据库1到10条数据,每页显示两条(5页)
db.集合名.find().sort().skip((当前页-1)*每页显示的条数).limit(数字)
2
3
4
5
6
7
# 9.聚合查询
语法:db.集合名.aggregate([{管道:{表达式}}...])
| 常用管道 | 作用 |
|---|---|
| $group | 将集合中的文档分组,用于统计结果 |
| $match | 过滤数据,只要数据符合条件的文档 |
| $sort | 聚合数据进一步排序 |
| $skip | 跳过指定文档数 |
| $limit | 限制集合数据返回文档数 |
| 常用表达式 | 作用 |
|---|---|
| $sum | 总和;$sum:1,同平常用的 count 一样,表示统计 |
| $avg | 平均 |
| $min | 最小值 |
| $max | 最大值 |
- 练习
已有数据
> db.test.find()
{"_id":1,"name":"a","sex":1,"age":1}
{"_id":2,"name":"a","sex":1,"age":2}
{"_id":3,"name":"b","sex":2,"age":3}
{"_id":4,"name":"c","sex":2,"age":4}
{"_id":5,"name":"d","sex":2,"age":5}
2
3
4
5
6
#统计男生、女生的总年龄
db.test.aggregate([
{
$group:{
_id:"$sex", #分组年龄
rs:{$sum:"$age"} #求男女生年龄总和
}
}
])
#统计男生、女生的总人数
db.test.aggregate([
{
$group:{
_id:"$sex", #id是用来按字段分组的,这里是按年龄分组
rs:{$sum:1} #求男女生年龄总和
}
}
])
#求学生总数和平均年龄
db.test.aggregate([
{
$group:{
_id:null, #按全部字段分组
total_num:{$sum:1}
total_avg:{$avg:"$age"}
}
}
])
#查询男生、女生人数,按人数升序
db.test.aggregate([
{$group:{_id:"$sex",rs:{$sum:1}}}
{$sort:{rs:1}}
])
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 10.索引
(1)优缺点
- 优点
提高数据查询效率,降低数据库的 IO 成本;通过索引对数据进行排序,降低数据排序的成本,降低 CPU 的消耗。
- 缺点
占用磁盘空间;大量索引影响 SQL 语句效率,因为每次插入和修改数据都需要更新索引。
(2)创建索引
db.集合名.createIndex(待创建索引的列[,额外选项])
- 参数: 待创建索引的列:{键:1,...,键:-1} 说明:1,升序;-1 降序 额外选项:设置索引名称或者唯一索引
(3)删除索引
全部删除:db.集合名.dropIndexes() 删除指定:db.集合名.dropIndexes(索引名)
(4)查看索引
db.集合名.getIndexes()
(5)示例
向数据库中新增数据
use testbase
for(var i=0;i<10;i++){
db.testcollecion({'name':"aa"+i,"age":i})
}
2
3
4
# 1.给name添加普通索引
> db.testcollecion.createIndex({name:1})
> db.testcollecion.getIndexes() #查看当前索引
[
{
"v":2,
"key":{ #给哪个列设置了索引
"_id":1
},
"name":"_id_",
"ns":"test5.testcollecion",
},
{
"v":2,
"key":{
"name":1
},
"name":"name_1", #索引名称,默认系统生成,也可以自定义
"ns":"test5.testcollecion",
},
]
# 2.删除name索引
db.testcollecion.dropIndexes('name_1')
# 3.给name创建索引并起名demo
db.c1.createIndex({ "name":1},{name:"dmeo"})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(6)创建复合/组合索引
语法:db.集合名.createIndex({键 1:方式 1,键 2:方式 2}
- 说明:及时一次性给两个字段建立索引
- 应用场景:两个条件一起出现;查询慢的时候
- 练习
# 给name和age添加组合索引
db.testcollecion.createIndex({name:1,age:1})
2
(7)创建唯一索引
语法:db.集合名.createIndex(待添加索引的列,{unique:列名})
- 练习
# 设置唯一索引
db.testcollecion.createIndex({name:1},{unique:"name"})
2
(8)分析索引
前言:通过分析索引,可以了解这条数据是创建索引效率高还是不创建的时候高。
语法:db.集合名.find().explain('executionStats')
#查询age=18的数据
> db.test.find({age:18}).explain('executionStats')
2
结果分析:
- stage:COLLSCAN,全表扫描,最慢;IXSCAN,索引扫描,比较快;FETCH,根据索引去检索指定 document,比较快。
- executionTimeMillis:消耗的时间,可以在添加索引前后查看这个数据,看看是否需要添加索引。
关于详细的结果参数分析 (opens new window)
选择规则(如何选择合适的列创建索引):
- 为常做条件、排序、分组的字段建立索引
- 选择唯一性索引
如性别字段,同值较少,5万男,5万女,无意义。
- 选择较小的数据列,为较长的字符串使用前缀索引 索引也是占磁盘空间的。
# 二.可视化形式的操作
增、删、改、查基本使用与SQL,MySQL等数据库相差不大。
← 01.基础 03.mongoose使用 →