Mongodb 数据库学习笔记
作者: dkvirus 发表于: 2018-06-25 15:41:00 最近更新: 2018-09-29 09:50:55

数据库是什么,无非就是持久化储存数据。在接触数据库之前,我还记得我用的第一个持久化数据的方法是使用 Java 里提供的文件流操作的:先使用 read 方法读取本地 test.txt 文件,读取里面内容,在行末添加一条数据,再使用 write 方法将流写入 test.txt,实际上是替换之前的文件。本文为 Mongodb 数据库学习笔记。

一、安装

参照这哥们的教程,详细的很:《阿里云 centos7 安装mongoDB》

二、启动与关闭

1. 服务端启动与关闭

安装 mongodb 实际上安装的是 mongodb 服务端,用来提供保存数据、查询数据等服务。

centos7 mongodb 服务端启动、关闭等操作。

1
2
3
4
5
6
7
8
9
10
11
# 启动 mongodb(注意这里的服务名是 mongod,linux 中就喜欢将服务以 d 结尾,如 crond)
# systemctl start mongod

# 重启 mongodb(一般修改配置文件之后重启)
# systemctl restart mongod

# 查看 mongodb 运行状态
# systemctl status mongod

# 关闭 mongodb 服务端
# systemctl stop mongod

2. 客户端启动和关闭

在客户端进行查询操作,客户端帮我们与服务端通信,将数据显示在客户端里让我们看见。换言之,我们不会直接跟数据库服务端打交道,唯一要说有交集那就是启动数据库服务端,其它的都是通过客户端这个中间人来传达意思。

第一种:黑窗口中的客户端

在 dos 窗口敲入 mongo 出现下面这东东。可以在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@hd1h2g ~]# mongo
MongoDB shell version v3.4.14
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.14
Server has startup warnings:
2018-04-13T10:32:42.689+0800 I STORAGE [initandlisten]
2018-04-13T10:32:42.689+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-04-13T10:32:42.689+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten]
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten]
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten]
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-04-13T10:32:43.118+0800 I CONTROL [initandlisten]
2018-04-13T10:32:43.119+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-04-13T10:32:43.119+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-04-13T10:32:43.119+0800 I CONTROL [initandlisten]
>

要退出敲入 exit 或者 Ctrl + C 即可。

第二种:图形化客户端

mongodb 的图形化客户端我知道的有 NoSQL Manager for MongoDB

要退出点击软件右上角叉叉。

第三种:代码里通过 mongoose 库充当客户端

在写 node 项目里,mongoose 库用于连接 node 与 mongodb,这个库相当于”客户端”,因为咱是通过它跟数据库服务端打交道的吧。

要退出中断 node 程序即可。

三、配置文件

1. 数据存储路径和日志路径

数据库中我们关心两个路径:

  • 一个是数据库数据存放路径。前面也说了要做到数据持久化就要把数据保存在本地硬盘上,之前傻乎乎的用文件流api做这事;
  • 一个是数据库日志文件路径。日志的用处就是记录谁连接了数据库,做了哪些操作,在操作数据库遇到问题看日志文件往往能获得重要线索。

第一次在 linux 上安装完一个软件,那叫一个懵逼,不知道装到什么位置去了。

这里装了 mongodb,第一步去看看配置文件吧,配置文件中有很多有用的信息,配置文件一般放在 /etc 目录下,然后用软件名命名,mongodb 的配置文件名称为 mongod.conf

1
# vim /etc/mongod.conf

在配置文件中可以看到:

数据存放路径

1
2
3
4
5
12 # Where and how to store data.
13 storage:
14 dbPath: /var/lib/mongo
15 journal:
16 enabled: true

日志存放路径

1
2
3
4
5
 6 # where to write logging data.
7 systemLog:
8 destination: file
9 logAppend: true
10 path: /var/log/mongodb/mongod.log

2. 允许远程连数据库

1)修改配置文件

1
# vim /etc/mongod.conf

2)设置允许远程连接

29 行我这里注释了,因为我进行远程连接,如果没有注释,意思就是只能用 127.0.0.1 这个 ip 连接数据库,顾名思义,127.0.0.1 代表本机,其它人就没法连这个数据库了。

1
2
3
4
26 # network interfaces
27 net:
28 port: 27017
29 # bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.

3)重新启动 mongodb

1
# systemctl restart mongod

4)检查是否替换

ss -lnt 查看启动的端口,可以看到 27017 端口前面变成了 *,倘若没有注释上面 29 行代码这里应该是 127.0.0.1:27017

1
2
3
4
5
# ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 *:27017 *:*

5)本地写测试代码

编写 index.js(记得 npm install mongoose)

1
2
3
4
5
6
7
8
9
10
11
// 设置远程库地址
var mongoose = require('mongoose');
// 这里的 ip 是我虚拟机上的
mongoose.connect('mongodb://192.168.13.171:27017/test');

// 连接远程数据库
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log('connection db successfully~');
});

运行,如下说明本地连接远程数据库成功。

1
2
D:\test\git\test-mongoose>node index.js
connection db successfully~

四、API

说的通俗点就是在电脑上新建一个文件夹,这个文件夹就作为一个数据库。

数据库里有表,在文件夹里创建 Excel 文件,一个 Excel 文件就是一张表,表在 Mongodb 中叫做集合

表中有一条条的数据,在 Excel 里就是每一行都是一条数据,这些在 Mongodb 中叫做 文档

Mongodb 客户端(黑窗口里的)相比于 Mysql 客户端有个爽点就是每条指令后面不需要强制加分号 ;

1. 数据库

数据库的操作掰着手指头也就那么几个功能。

  • 第一次进入 Mongodb,想查询有哪些数据库;(有哪些文件夹)
  • 想要进入某个数据库做操作,那么就需要切换到指定数据库;(进入文件夹)
  • 时间久了,忘了当前操作的是哪个数据库了,想要查询;(查询当前操作文件夹名称)
  • 默认数据库都是我需要的,我想要新建一个数据库,如何新建;(新建文件夹)
  • 新建数据库的名字写错了,想要修改;(修改文件夹名称)
  • 新建数据库不想要的,想删除;(删除文件夹)
  • 备份数据库;(将文件夹保存到其它路径下)
  • 还原数据库;(从其它地方将文件夹复制到 Mongodb 下面)
含义 操作
查询所有数据库 show dbs 或 show databases
切换到指定数据库 use test (切换到 test 数据库)
查看当前操作是哪个数据库 db
新增数据库 use mydb (mydb 数据库不存在,使用 use 就会新建,存在就会切换)
删除数据库 use mydb (先切换到数据库) db.dropDatabase() (删除数据库)
重命名数据库
备份数据库
还原数据库

2. 集合

聊聊集合,也就是传统数据库中的表。常见操作捋一捋也就那么几个。

  • 查看数据库下有哪些集合;(查看文件夹下有哪些 Excel 文件)
  • 创建集合;(创建 Excel 文件)
  • 删除集合;(删除 Excel 文件)
  • 重命名集合名;(重命名 Excel 文件名称)

集合操作需要在具体数据库下进行操作,这里默认已经切换到 test 数据库下(use test)。

含义 操作 备注
查看所有集合 show tables
创建集合 db.col.insertOne({ name: ‘dkvirus’ }) 新增数据时如果没有集合会自动创建集合,这里的 col 就是集合的名字
删除集合 db.col.drop() 删除 col 集合
重命名集合名

3. 文档

数据库中说到底还是对数据的操作。其中又可以分为两个阵营,查询数据增删改数据

练习:建学生表,插入学生信息(姓名、年龄、性别),查询性别为男的学生,查询年龄大于 20 的学生,查询姓张的学生。

3.1 新增

含义 操作
新增一条数据 db.students.insert({ name: ‘dkvirus’, age: 25, gender: ‘male’ })
新增一条数据 db.students.insertOne({ name: ‘dkvirus’, age: 25, gender: ‘male’ })
新增多条数据 db.students.insertMany([ { name: ‘dkvirus’, age: 25, gender: ‘male’ }, { name: ‘tiger’, age: 31, gender: ‘male’ } ])

3.2 修改

含义 操作 备注
修改一条数据 db.students.update({ name: ‘dkvirus’ }, { $set: { name: ‘dk’ } }) 修改匹配的第一条数据
修改多条数据 db.students.update({ name: ‘dkvirus’ }, { $set: { name: ‘dk’ } }, { multi: true }) 修改所有匹配的数据

3.3 删除

含义 操作
删除所有匹配的数据 db.students.remove({ name: ‘dkvirus’ })
删除所有匹配的数据 db.students.deleteMany({ name: ‘dkvirus’ })
删除匹配的第一条数据 db.students.remove({ name: ‘dkvirus’ }, { justOne: 1 })
删除匹配的第一条数据 db.students.deleteOne({ name: ‘dkvirus’ })
删除所有数据,集合仍存在 db.students.deleteMany({})

3.4 查询

含义 操作
查询所有文档 db.students.find()
格式化后查看文档 db.students.find().pretty()
只返回 name 字段的文档 db.students.find({}, { _id: 0, name: 1 }) (字段值为0不展示,为1展示)
只返回 name 字段的文档 db.students.aggregate({ $project: { name: 1 } })
查询年龄为 25 的文档 db.students.find({ age: 25 })
查询年龄小于 25 的文档 db.students.find({ age: { $lt: 25 } }) (其它符号:$lte、$gt、$gte、$ne)
AND:查询年龄大于 25 小于 35 的文档 db.students.find({ age: { $gt: 25, $lt: 35 } })
AND:查询年龄25岁,姓名dkvirus的文档 db.students.find({ age: 25, name: ‘dkvirus’ })
OR:查询年龄25岁或31岁的文档 db.students.find({ $or: [{ age: 25 }, { age: 31 }] })
LIMIT:查询10条文档 db.students.find().limit(10)
SKIP:跳过前面十条文档开始查询 db.students.find().skip(10)
分页:查询第 21-30 条文档数据 db.students.find().skip(20).limit(10)
SORT:排序查文档 db.students.find().sort({ age: 1 })(1升序,-1降序。执行顺序:sort>skip>limit)
模糊查询 db.students.find({ name: /dk/ })(查询name包含dk的文档,以..开头用^,以..结尾用$)

五、Mongoose

关于 Mongoose 使用,推荐直接阅读 《Mongoose官方文档》

网上也看了一些介绍用法的文章,不是版本太老就是描述拖拉,官方文档为最新版本的最新文档,讲的也挺简洁,上手容易。

六、索引

一直不太明白索引是啥意思,昨晚问了同事,现在稍微有点概念。

书本前面会有目录,通过目录标题可以找到具体页数快速定位到要找的内容。数据库中的索引也是快速查询的一种手段。

索引也有弊端,那就是建立索引需要花时间。

这就好比在写一本书的目录,需要一个个比对第几章节在第几页。如果书内容很多,那么目录制作会花很长时间。

在数据库中新增一条数据,那么索引也要更新,这也需要花费很多时间。这就好比一本书在中间部分又新增了内容,那整本书的目录也得重新制作。

每个索引我把它叫做索引表,也就是书中的目录,数据库中都提供了相应的语句用来管理索引表——增删改查。

七、聚合

Mongodb 中特有的概念,和索引一样用于优化查询。

首页
友链
归档
dkvirus
动态
RSS