# 一.命令形式

# 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})
1
2

# 4.集合中数据的删

语法:db.集合名.remove(条件,[,是删除一条])

  • 说明:是否删除一条:true,是;false,否,默认

  • 练习:

# 删除一条
db.c3.remove({},true)
# 删除全部
db.c3.remove({})

1
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"}})
1
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都会在

1
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})
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(数字)

1
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}
1
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}}
])
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})
}
1
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"})

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

(6)创建复合/组合索引

语法:db.集合名.createIndex({键 1:方式 1,键 2:方式 2}

  • 说明:及时一次性给两个字段建立索引
  • 应用场景:两个条件一起出现;查询慢的时候
  • 练习
# 给name和age添加组合索引
db.testcollecion.createIndex({name:1,age:1})
1
2

(7)创建唯一索引

语法:db.集合名.createIndex(待添加索引的列,{unique:列名})

  • 练习
# 设置唯一索引
db.testcollecion.createIndex({name:1},{unique:"name"})
1
2

(8)分析索引

前言:通过分析索引,可以了解这条数据是创建索引效率高还是不创建的时候高。

语法:db.集合名.find().explain('executionStats')

#查询age=18的数据
> db.test.find({age:18}).explain('executionStats')
1
2

结果分析:

  • stage:COLLSCAN,全表扫描,最慢;IXSCAN,索引扫描,比较快;FETCH,根据索引去检索指定 document,比较快。
  • executionTimeMillis:消耗的时间,可以在添加索引前后查看这个数据,看看是否需要添加索引。

关于详细的结果参数分析 (opens new window)

选择规则(如何选择合适的列创建索引):

  • 为常做条件、排序、分组的字段建立索引
  • 选择唯一性索引

    如性别字段,同值较少,5万男,5万女,无意义。

  • 选择较小的数据列,为较长的字符串使用前缀索引 索引也是占磁盘空间的。

# 二.可视化形式的操作

增、删、改、查基本使用与SQL,MySQL等数据库相差不大。