MongoDB数据库 安装与配置

下载准备·

MongoDB官方下载地址

写在前面·

这里,我将介绍Windows版和Linux版的搭建过程。

Windows版 Linux版

Windows版·

  1. 运行mongodb-windows-x86_64-4.4.2-signed.msi进行安装(本文默认解压到了 C:\MongoDB\Server\4.2)。

    安装比较容易,但有一个关键是,不要安装MongoDB Compass,这是MongoDB的官方图形用户界面,很大,下载速度很慢,而且有其他更好的替代品。

    难点在配置文件,启动Mongodb的服务以及将MongoDB设置成Windows服务,加载配置文件在windows的“服务”中找到。

    关于网上教程中普遍推荐新建一个data文件夹等等一些操作,我的看法是可有可无,因为到了我这个版本,mongodb会自己创建这些东西。当然,如果为了方便寻找数据库和日志,自己建一个也可以。

    这里我就简单描述一下:
    (这里我默认在 C:\MongoDB\ 创建了文件夹)
    C:\MongoDB\data\log目录,用来存放日志文件;
    C:\MongoDB\Server\4.2\log\mongodb.log 里的 mongodb.log ,用来存放日志信息;
    C:\MongoDB\Server\4.2\data\db目录,用来存放数据库数据。

  2. 在C:\MongoDB\Server\4.2\data目录下创建db文件夹(因为默认安装中没有这个文件夹,但后面要用)
    在C:\MongoDB\Server\4.2目录下创建mongo.config,在文件内部复制如下文本:

    mongo.configview raw
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #端口号 默认为27017
    port=27017

    ##数据文件 此处=后对应到数据所存放的目录
    dbpath=C:\MongoDB\Server\4.2\data\db

    ##日志文件 此处=后对应到日志文件所在路径
    logpath=C:\MongoDB\Server\4.2\log\mongodb.log

    #启用日志文件,默认启用,每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
    journal=true

    ##错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
    logappend=true

    #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    quiet=true

    #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB
    bind_ip = 0.0.0.0
  3. 安装服务
    管理员权限打开cmd命令行,输入如下命令安装mongodb服务:

    1
    sc create MongoDB binPath= "C:\MongoDB\Server\4.2\bin\mongod.exe --service --config=C:\MongoDB\Server\4.2\mongo.config" 

    如果一直显示[SC] CreateService 失败 1072:指定的服务已标记为删除。,那请先退出服务那个窗口,因为那个占用“频道”了。
    cd 进入C:\MongoDB\Server\4.2\bin文件夹,使用如下命令:

    1
    2
    3
    cd C:\MongoDB\Server\4.2\bin

    mongod --config C:\MongoDB\Server\4.2\mongo.config --install --serviceName "MongoDB"

    继续使用如下命令:

    1
    mongod --logpath "C:\MongoDB\Server\4.2\log\mongodb.log" --logappend --dbpath "C:\MongoDB\Server\4.2\data\db" --serviceName "MongoDB" --install

​ 然后在cmd里输入services.msc打开服务管理器,找到MongoDB服务,设置成自动启动,并启动。

​ 如果启动不成功,先删除服务,使用如下命令:

sc delete MongoDB

​ 然后再从第2步开始,重新排查各种配置项及操作


  1. 测试是否安装成功
    进入C:\MongoDB\Server\4.2\bin文件夹下,点击mongod.exe,如果闪一下退出,说明安装正常。
    然后在浏览器里访问这个地址http://localhost:27017/
    如果显示了

    It looks like you are trying to access MongoDB over HTTP on the native driver port.

    说明服务和端口正常。


配置环境变量(可省略)·

  • 如果不配置环境变量,在使用mongo命令时要先 cd 进入C:\MongoDB\Server\4.2\bin 目录才能使用命令
  • 通过配置环境变量的方式,让mongo命令在所有文件夹内都可以访问
    在系统变量中找到path,双击打开后在变量值中的末尾增加输入C:\MongoDB\Server\4.2\bin;即可
    (Win10则双击打开后点击“编辑文本”同样在变量值中的末尾增加输入)!

远程连接MongoDB数据库(Windows版)·

打开bin目录中的mongod.cfg文件进行编辑,其中bindIp:127.0.0.1改为0.0.0.0 不然别的地方访问不了,
取消security的#注释符,并添加authorization:enabled

然后以管理员身份在bin目录下执行如下命令,使配置生效

1
mongod --config "C:\MongoDB\Server\4.2\bin\mongod.cfg" --install

然后重启MongoDB服务

1
2
net stop mongodb    // 先关闭mongodb
net start mongodb // 后开启mongodb

这里设置了0.0.0.0允许远程访问,所以最好加一层验证,添加一个mongo用户进行管理。
在bin目录打开cmd输入mongo执行命令

1
2
3
4
5
cd C:\MongoDB\Server\4.2\bin

mongo

use admin
1
2
3
4
5
6
  db.createUser({
"user":"admin","pwd":"password",
"roles":[
{role:"userAdminAnyDatabase", db: "admin"},
{role:"readWriteAnyDatabase", db: "admin"}
]});

这里就添加了一个admin的用户,密码为password

另外远程访问的话,记得开启安全组和防火墙端口,可能会因为这个导致全盘皆输

Linux版·

解压MongoDB压缩包·

假设已将文件下载到 /home/ 目录下,打开终端,通过使用下面的命令

1
2
3
4
5
cd /home

tar -xzvf mongodb-linux-x86_64-rhel80-5.0.6.tgz

mv /home/mongodb-linux-x86_64-rhel80-5.0.6.tgz /home/software/mongodb-5.0.6

解压文件,从而在 /home/software 目录下生成 mongodb-5.0.6目录


配置MongoDB·

为了快速使用mongodb命令, 可以配置环境变量。

编辑 ~/.profile/etc/profile 文件, 将mongodb/bin路径加入即可,打开终端,输入命令:

1
sudo vim /etc/profile

/etc/profile中,按i进入编辑模式,在最下面添加以下行,注意路径:

1
export PATH=$PATH:/home/software/mongodb-5.0.6/bin

ESC退出编辑模式,再输入:wq保存修改后,在终端运行以下命令使环境变量生效:

1
source /etc/profile

注意:建议重启一下,不然,每新打开一个终端,都要输入source /etc/profile才能使用mongo命令

然后,是建立数据库的存放位置和日志文件的存放位置,在终端运行以下命令

1
2
3
4
5
//用于存放数据库
mkdir -p /home/data/mongo-db

//用于存放日志文件
mkdir -p /home/data/mongo-log

接着,在/home/software/mongodb-5.0.6目录下新建一个名为 mongodb.conf 的配置文件,写入如下配置内容:

1
vim mongodb.conf

i进入编辑模式,按ESC退出编辑模式,再输入:wq保存修改。

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
#端口
port=27017

#默认127.0.0.1为只允许本地连接;0.0.0.0为不限制;多个指定服务器用","连接
bind_ip=127.0.0.1

#数据库存文件存放目录
dbpath=/home/data/mongo-db

#日志文件
logpath=/home/data/mongo-log/mongodb.log

#使用追加的方式写日志
logappend=true

#以守护程序的方式启用,即在后台运行
fork=true

#最大同时连接数
maxConns=100

#不启用验证
noauth=true

#每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
journal=true

#存储引擎有mmapv1、wiretiger、mongorocks
storageEngine=wiredTiger

用以下命令启动mongodb:

1
mongod --config /home/software/mongodb-5.0.6/mongodb.conf

这时mongod已经启动了(这代表mongodb已经开始在后台运行)

测试mongodb安装·

继续在终端输入mongo进入交互程序:

mongo

行首出现 > 表示进入mongo的交互程序,此时输入:

show dbs;

出现

1
2
3
>admin    0.000GB
>config 0.000GB
>local 0.000GB

即安装成功

关于 MongoDB用户 的命令·

MongoDB用户命令.txtview raw
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
show dbs        查看数据库
use dbname 进入数据库
show users 查看当前数据库用户权限
创建用户
db.createUser({user:"usertest",pwd:"passtest",roles:[ {role:"clusterAdmin", db:"admin" }, {role:"readAnyDatabase",db:"admin" }, {role:"readWrite",db:"testDB" } ]})
权限详解
内建角色:
数据库用户角色: read、readWrite;
数据库管理角色: dbAdmin、dbOwner、userAdmin;
集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色: backup、restore;
所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色: root; 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
内部角色: __system;
------------------------------------------------------------------------------------------


角色说明:
Read: 允许用户读取指定数据库
readWrite: 允许用户读写指定数据库
dbAdmin: 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin: 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
dbOwner: 允许在当前DB中执行任意操作
readAnyDatabase: 赋予用户所有数据库的读权限,只在admin数据库中可用
readWriteAnyDatabase: 赋予用户所有数据库的读写权限,只在admin数据库中可用
userAdminAnyDatabase: 赋予用户所有数据库管理User的权限,只在admin数据库中可用
dbAdminAnyDatabase: 赋予管理所有数据库的权限,只在admin数据库中可用
root: 超级账号,超级权限,只在admin数据库中可用。

------------------------------------------------------------------------------------------

集群管理角色:
clusterAdmin: 赋予管理集群的最高权限,只在admin数据库中可用
clusterManager: 赋予管理和监控集群的权限
clusterMonitor: 赋予监控集群的权限,对监控工具具有readonly的权限
hostManager: 赋予管理Server

修改密码
方法1:db.changeUserPassword("usertest","changepass");
方法2:db.updateUser("usertest",{pwd:"changepass1"});

修改权限
db.updateUser("usertest",{roles:[ {role:"read",db:"testDB"} ]})

注:updateuser它是完全替换之前的值,如果要新增或添加roles而不是代替它
则使用方法: db.grantRolesToUser() 和 db.revokeRolesFromUser()

------------------------------------------------------------------------------------------

修改权限
db.grantRolesToUser("usertest", [{role:"readWrite", db:"testDB"},{role:"read", db:"testDB"}])
删除权限
db.revokeRolesFromUser("usertest",[{role:"read", db:"testDB"}])

MongoDB命令·

mongodb.txtview raw
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
这是mongodb的一些命令: 

mongo
运行mongo

以下命令要运行mongo以后才能用

db
显示当前的数据库名称

show dbs
显示当前服务器下数据库(非空的数据库)列表

use test
如果test数据库不存在,则创建test数据库
如果test已存在,则切换到test数据库

show collections
显示当前数据库下所包含的集合(表)列表

db.users.insert({name:'zhangsha'})
向users集合中插入数据
如果users集合存在,则直接插入数据,如果不存在,则创建users集合再插入数据

db.createCollection('products')
创建一个空集合products

db.products.insert([{name:'lishi'},{name:'wangwu'}])
一次插入多个数据

db.products.find()
查询products集合中所有的数据

db.products.find({name:'苹果手机'})
查询stu集合中name='苹果手机'的数据

db.products.find({name:{$eq:'苹果手机'}})
同上,$eq=>等号,建议使用上面的方式,易记,易输入
eq = equal

db.products.find({price:{$gt:18}})
查询stu集合中age>18的数据
把$gt换成如下的符号试试:
$gt=>大于 great
$gte=>大于等于 great equal
$lt=>小于 less than
$lte=>小于等于 less than equal
$ne=>不等于 not equal
$in=>在范围内
$nin=>不在范围内
以上几个符号格式总结为:{ field: {符号: value}}

db.products.find({name:/^华为/})
查找stu集合中name域中以“华为”字符的开头的数据

db.products.find({name:{$in:['手机1','手机2']}})
查询stu集合中name='手机1'和name='手机2'的数据
$in=>在范围内
$nin=>不在范围内
以上两个符号格式为:{ field:{符号:[value1,value2,....]}}

db.products.find({name:"华为手机",price:800})
查找name="华为手机"并且price:800的数据

db.products.find({$or:[{name:'华为手机'},{price:{$lt:1000}}]})
查询products集合中name='华为手机' 或者 price<1000的数据
$or=>或者 注意$or:[{},{},....]
$and=>并且 格式同$or, 例:{$and:[{},{},....]}
$nor=>not or 与$or相反, 格式同$or

db.products.find({price:{$not:{$gt:100}}})
查询products集合中price<=100的数据,不存在price属性的数据也会查询出来
$not=>取反

db.products.find({price:{$exists: true}})
查询products集合中包含域名称为price的数据

db.products.find({name:{$type:2}})
查询products集合中name属性为字符串类型的数据


db.products.find({
$where: function(){
return this.name == '华为手机'
}
})
查询products集合中name='华为手机’的数据


db.products.find({
$where: function(){
return this.name.indexOf('华为手机') > -1;
}
})
查询products集合中name域中包含“华为手机”字符的数据


db.products.update({name:'华为手机'},{$set:{price:2000}},{
upsert: true,
multi:false
})
把products集合中name='华为手机'的那条数据,把price属性设置成2000,其它属性保留
$set是指更改的属性列表,不在列表中其他属性会被保留,如果不加此符号,其它属性会被丢弃(_id属性比较特殊,不会丢失)
upsert:true如果没有符号条件的更新时,则插入一条,为false时,则不会插入, 默认是false
multi:false一次只能更新一条数据,为true时,可更新多条,默认是false

db.students.remove({})
清空集合students

db.products.remove({name:'abc'})
删除products集合中name='abc'的数据,注意,即使把集合products中的所有数据都删除了
products集合仍然存在, remove()是用来删除数据的,而drop()不仅会删除数据,还会把集合的结构给删除

db.products.drop()
把stu集合彻底从当前数据中删除,集合stu不再存在,注意与remove()的区别

db.dropDatabase()
删除当前数据库

db.users.distinct('name')
查询users集合中不重复的name属性,返回的是数组

db.stu.count({name:'zhangshan'})
查询stu集合中name='zhangshan'的数据数量

db.stu.find().limit(5)
查询stu集合中前5条数据

db.stu.find().skip(5)
查询stu集合中跳过前5条后的数据

db.stu.find().sort({name:1})
查询stu集合中的全部数据,并按name属性正序排列 注:1:正序 -1: 倒序

由于mongodb的api接口方法很多,除以上命令外,其他的命令请多看官方文档