MongoDB基础

介绍

技术 特性 适用场景 说明
MongoDB - 高并发
- 海量数据存储
- 高可扩展性
- 高可用
数据量大
写入操作频繁(读写都很频繁)
价值较低的数据,对事务性要求不高
不需要事务及复杂join支持
新应用,需求会变,数据模型无法确定,想快速迭代开发
2000-3000以上的读写QPS
TB甚至PB级别数据存储
应用发展迅速,需要能快速水平扩展
大量的地理位置查询、文本查询
- MongoDB是一个开源、高性能、无模式的文档型数据库。
- 官网
- Doc
- 下载
mongodb-driver mongodb-driver是mongo官方推出的java连接mongoDB的驱动包。
- 官方
- Getting Started
SpringDataMongoDB SpringData家族成员之一,用于操作MongoDB的持久层框架,封装了底层的mongodb-driver。
- 官方

单机性能

说明
CPU 2x Deca Core Xeon 2690 V2 - 3.00GHz (Ivy Bridge) - 2 x 25MB cache
内存 128 GB DDR3 1333
硬盘
2x 960GB SSD drives, SATA Disk Controller
网络 10 Gbps
OS Ubuntu 14.10 (64 bit)
版本 MongoDB 3.0.1
50%读写请求 12万每秒并发
95%的读 超过25万每秒的并发

基础概念

关系型数据库与MongoDB体系结构对比

对比项 关系型数据库 MongoDB
数据库 数据库 数据库
table(表) Collection(集合)
row(行) Document(文档)
column field

MongoDB 版本命名规范

x.y.z

  • y 为奇数时表示当前版本为开发版,如1.5.2、4.1.13
  • y 为偶数时表示当前版本为稳定版,如1.6.3、4.0.10
  • z 是修正版本号,数字越大越好

特殊作用的数据库

数据库 说明
admin 从全县的角度看,这是‘root’数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
config 当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

执行计划

查询项 希望看到的组合 不希望看到的组合
普通查询 - Fetch+IDHACK
- Fetch+ixscan
- Limit+(Fetch+ixscan)
- PROJECTION+ixscan
- SHARDING_FILTER+ixscan
- COLLSCAN(全表扫)
- SORT(使用sort但是无index)
- 不合理的SKIP
- SUBPLA(未用到index的$or)
count查询 - COUNT_SCAN - COUNTSCAN

副本集

副本集角色

角色 说明 约束
主节点(Primary) 接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。 一个Replica Set只能有一个Primary节点
副本节点(Secondary) 与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
仲裁者(Arbiter) 不保有数据,不参与选主,只进行选主投票
使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上
注意,一个自动failover的Replica Set节点数必须为奇数,目的是选主投票的时候要有一个大多数才能进行选主决策。
不保有数据,不参与选主,只进行选主投票
在生产环境下它和其他数据节点不要部署在同一台机器上
一个自动failover的Replica Set节点数必须为奇数

主节点选举触发条件

  1. 主节点故障
  2. 主节点网络不可达(默认心跳信息为10秒)
  3. 人工干预(rs.stepDown(600))

选举规则

  1. 票数最高
  2. 若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。

分片

分片概念

分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。

分片角色

分片角色 作用 约束
配置服务器 是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。
像启动普通的mongod一样启动配置服务器,指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真是数据的200MB。
保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。
配置服务器必须开启奇数个,如1个或则3个,开启2个则会报错
路由服务器 即mongos,起到一个路由的功能,供程序连接。
本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
-
分片服务器 是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。 -

MongoDB 生产环境的模式

模式 优点 缺点 适用场景
主从复制 可以有效降低数据库的压力 切换需要手动干预 官方已经不推荐使用主从复制模式。
副本集 1. 自动选举
2. 不需要手动干预便可以实现活跃与非活跃的切换
每个节点都是一个完成的备份,则不能使用MongoDb的分布式计算功能 1. 数据量少
2. 读多写少,对写性能要求不高
分片 1. 更大的数据存储量
2. 更好的写性能
1. 单个机器的磁盘不够用了
2. 单个mongod已经不能满足写数据的性能要求
3. 想把大量数据放到内存里提高性能

安全认证

MongoDB内置角色

分类 内置角色 说明
数据库用户角色 read 可以读取指定数据库中任何数据。
数据库用户角色 readWrite 可以读写指定数据库中任何数据,包括创建、重命名、删除集合。
所有数据库用户角色 readAnyDatabase 可以读取所有数据库中任何数据(除了数据库config和local之外)。
所有数据库用户角色 readWriteAnyDatabase 可以读写所有数据库中任何数据(除了数据库config和local之外)。
所有数据库用户角色 userAdminAnyDatabase 可以指在指定数据库创建和修改用户(除了数据库config和local之外)。
所有数据库用户角色 dbAdminAnyDatabase 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作(除了数据库config和local之外)。
数据库管理角色 dbAdmin 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作。
数据库管理角色 dbOwner
数据库管理角色 userAdmin 可以在指定数据库创建和修改用户。
集群管理角色 clusterAdmin 可以对整个集群或数据库系统进行管理操作。
集群管理角色 clusterManager 提供集群管理和监控权限。具有此角色的用户可以访问复制集和分片的 local, config 数据库。
集群管理角色 clusterMonitor 为MongoDB Cloud Manager和Ops Manager监控代理工具提供只读访问权限。
集群管理角色 hostManager 提供监控和管理服务器(servers)的能力。
备份恢复角色 backup 备份MongoDB数据最小的权限。
备份恢复角色 restore 从备份文件中还原恢复MongoDB数据(除了system.profile集合)的权限。
超级用户角色 root 超级账号,超级权限。
内部角色 system 提供对数据库中任何对象执行任何操作的权限。

基础命令

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
# 选择和创建数据库
$ use 数据库名称

# 查看有权限查看的所有的数据库
$ show dbs
$ show databases

# 查看当前正在使用的数据库
$ db

# 删除数据库
$ db.dropDatabase()

# 显式创建集合
$ db.createCollection(集合名称)

# 查看当前数据库中的集合
$ show collections
$ show tables

# 删除集合
$ db.集合名称.drop()

# 单个文档的插入
## 使用 db.collection.insert() 或 db.collection.save()
$ db.collection.insert(
{

}
)

# 批量插入
$ db.collection.insertMany(
{

}
)

# 文档查询
$ db.collection.find(<query>,[projection])

# 投影(相当于 select _id,userid from collection orderby userid arsc)
$ db.collection.find({},userid:1)

# 文档更新(默认只修改第一条数据)
$ db.collection.update(query,update,options)
## 覆盖修改(执行后,这条文档除了likenum字段其它字段都不见了)
$ db.collection.update({_id:"1"},{likenum:NumberInt(1001)})
## 局部修改
$ db.collection.update({_id:"2"},{$set:likenum:NumberInt(1001)})
## 批量修改(修改所有符合条件的记录)
$ db.collection.update({_id:"2"},{$set:likenum:NumberInt(1001)},{multi:true})

# 列值增长的修改
## 实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc 运算符实现。
$ db.collection.update({_id:"3"},{$inc:likenum:NumberInt(1)})

# 删除文档
$ db.collection.remove(条件)

# 删除所有(慎用)
$ db.collection.remove({})

# 统计查询
$ db.collection.count(query,options)

# 分页查询
## limit 默认值 20
$ db.collection.find().limit(NUMBER).skip(NUMBER)

# 排序查询
$ db.collection.find().sort(排序方式)
## 对 userid 降序排列,对访问量升序排列
$ db.collection.find().sort({userid:-1,likenum:1})
## 注意:skip()、limit()、sort()三个放在一起执行的时候,执行的顺序是先sort(),然后是skip(),最后显示的limit(),和命令编写顺序无关。

# 比较查询
## $gt: 大于
## $lt: 小于
## $gte: 大于等于
## $lte: 小于等于
## $ne: 不等于
## 示例:查询评论点赞数大于700的记录
$ db.collection.find({likenum:{$gt:NumberInt(700)}})

# 包含查询
## 包含:$in
## 不包含:$nin
## 示例:查询评论集合中userid字段包含1003或1004的文档
$ db.collection.find({userid:{$in:["1003","1004"]}})
## 示例:查询评论集合中userid字段不包含1003或1004的文档
$ db.collection.find({userid:{$nin:["1003","1004"]}})

# 条件连接查询
## 查询中同时满足两个以上条件,需要使用 $and 操作符将条件进行关联,格式为:
$and:[{},{},{}]
$or:[{},{},{}]
## 示例:查询评论集合中likenum大于等于700并且小于2000的文档
$ db.collection.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:$lt:NumberInt(2000)}]})

# 查看索引
$ db.collection.getIndexes()

# 创建索引
$ db.collection.createIndex(keys,options)

# 移除索引
$ db.collection.dropIndex(index)

# 移除所有索引
$ db.collection.dropIndexes()

# 查看执行计划
$ db.collection.find(query,options).explain(options)
## "winningPlan":{"statge:"FETCH"} 走索引
## "winningPlan":{"statge:"COLLSCAN"} 全局扫描

SpringData连接字符串

1
spring.data.mongodb.uri=mongodb://username:password@localhost/database

SpringData连接副本集

1
2
3
spring.data.mongodb.uri=mongodb://ip1:27017,ip2:27017,ip3:27017/articledb?connect=replicaSet&slaveOk=true&replicaSet=副本集名字
# slaveOk=true:开启副本节点读的功能,可实现读写分离。
# connect=replicaSet:自动到副本集中选择读写的主机。

运维

命令行访问

1
$ mongo --port 27017 -u "username" -p "password" --authenticationDatabase "admin"

安装

参考Install MongoDB Community Edition

CentOS7安装MongoDB

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
# 下载
$ cd /usr/local
$ wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.1-1.el7.x86_64.rpm
$ wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-mongos-4.2.1-1.el7.x86_64.rpm
$ wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-tools-4.2.1-1.el7.x86_64.rpm
$ wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-shell-4.2.1-1.el7.x86_64.rpm

# 安装
$ yum -y localinstall mongodb-org-mongos-4.2.1-1.el7.x86_64.rpm
$ yum -y localinstall mongodb-org-server-4.2.1-1.el7.x86_64.rpm
$ yum -y localinstall mongodb-org-shell-4.2.1-1.el7.x86_64.rpm
$ yum -y localinstall mongodb-org-tools-4.2.1-1.el7.x86_64.rpm

# 创建数据存储目录
$ mkdir -p /data-run/mongodb/data/db

# 创建日志文件
$ touch /data-run/mongodb/logs

# 设置所有者
$ chown -R mongod:mongod /data-run/

# 配置配置文件
$ vi /etc/mongod.conf
##### 内容开始 #####
dbpath=/data-run/mongodb/data/db
logpath=/data-run/mongodb/logs
fork=true
auth=true
bind_ip=0.0.0.0
##### 内容结束 #####

# 管理mongodb
$ systemctl status mongod.service
$ systemctl start mongod.service
$ systemctl stop mongod.service
$ systemctl enable mongod.service

Ubuntu16.04中安装MongoDB

参考Install MongoDB Community Edition on Ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载
$ cd /usr/local
$ https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-server_4.2.0_amd64.deb

# 安装
$ dpkg -i mongodb-org-server_4.2.0_amd64.deb

# 安装客户端
$ wget https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-shell_4.2.0_amd64.deb
$ dpkg -i mongodb-org-shell_4.2.0_amd64.deb

# 安装运维工具
$ wget https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-tools_4.2.0_amd64.deb
$ dpkg -i mongodb-org-tools_4.2.0_amd64.deb

Ubuntu18.04中安装MongoDB

参考Install MongoDB Community Edition on Ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载
$ cd /usr/local
$ wget https://repo.mongodb.org/apt/ubuntu/dists/bionic/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-server_4.2.0_amd64.deb

# 安装
$ dpkg -i mongodb-org-server_4.2.0_amd64.deb

# 安装客户端
$ wget https://repo.mongodb.org/apt/ubuntu/dists/bionic/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-shell_4.2.0_amd64.deb
$ dpkg -i mongodb-org-shell_4.2.0_amd64.deb

# 安装运维工具
$ wget https://repo.mongodb.org/apt/ubuntu/dists/bionic/mongodb-org/4.2/multiverse/binary-amd64/mongodb-org-tools_4.2.0_amd64.deb
$ dpkg -i mongodb-org-tools_4.2.0_amd64.deb

Mac中安装MongoDB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装
$ brew services stop mongodb
$ brew uninstall mongodb
$ brew tap mongodb/brew
# 安装MongoDB社区服务器和命令行工具的最新4.2.x生产版本
$ brew install mongodb-community@4.2
# 仅安装最新的mongoshell以连接到远程MongoDB实例
$ brew install mongodb-community-shell
$ brew services start mongodb-community
$ brew services stop mongodb-community
# 手动启动 mongod
$ mongod --config /usr/local/etc/mongod.conf
# 手动关闭
$ mongo admin --eval "db.shutdownServer()"

# 配置文件:/usr/local/etc/mongod.conf
# 日志目录路径:/usr/local/var/log/mongodb
# 数据目录路径:/usr/local/var/mongodb

配置mongod.conf

1
$ sudo vi /etc/mongod.conf

内容如下:

1
2
3
4
5
6
port=27017
dbpath=/mongodb/data/db
logpath=/mongodb/logs
logappend=true
noauth=true
wiredTigerCacheSizeGB = 1

管理服务

1
2
3
4
5
6
7
8
# 启动
$ sudo service mongod start

# 停止
$ sudo service mongod stop

# 重启
$ sudo service mongod restart

安全认证

创建管理员用户

1
2
3
4
5
6
7
$ mongo
> use admin
switched to db admin
> db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
# 验证是否创建成功,如果返回1,则表示成功。
> db.auth("admin", "admin")
> exit

创建dbOwner用户

该用户代表数据库所有者角色,拥有最高该数据库最高权限。比如新建索引等。

1
2
> use yourdatabase
> db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "dbOwner", db: "yourdatabase" }] })

创建数据库读写账户

该用户用于该数据的读写,只拥有读写权限。

1
2
> use yourdatabase
> db.createUser({ user: "youruser2", pwd: "yourpassword2", roles: [{ role: "readWrite", db: "yourdatabase" }] })

认证测试

1
2
3
4
# 切换到admin
> use admin
# 认证测试
> db.auth("myroot","123456")

配置开启验证

方法一

1
$ mongod --auth

方法二

1
2
3
4
5
6
7
# Mac版
$ vi /usr/local/etc/mongod.conf
# CentOS版
$ vi /etc/mongod.conf
# 增加如下配置
security:
authorization: enabled

重启MongoDB。

配置副本集安全认证

1
2
3
4
5
6
7
8
9
# 1. 创建副本集认证的 key 文件
$ openssl rand -base64 90 -out ./mongo.keyfile
# 2. 将key文件分发到其它节点的服务器中
# 3. 设置只针对当前用户可读
$ chmod 400 ./mongo.keyfile
# 4. 修改配置文件指定keyfile
security:
keyFile: /mongodb/replica_sets/mongo.keyfile
authorization: enabled

配置分片安全认证

如果是先开启安全认证,再创建账户。这时候就必须通过localhost登陆任意一个 mongos 路由,再创建用户。 提示:相当于一个后门,只能在admin下添加用户

配置 mongodb 服务器 公网ip

1
2
3
$ var config = rs.config();
$ config.members[0].host="公网ip";
$ rs.reconfig(config);

导出

1
2
3
$ mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段1,字段2 -o file --type json/csv
# 示例
$ ./mongoexport -h 127.0.0.1 -d dbname -c article -f title -o /usr/local/article.json --type json

导入

1
2
3
4
5
6
7
$ mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
# 示例
$ ./mongoimport -d dbname -c article --file /usr/local/article.json --headerline --type json
$ ./mongoimport -d dbname -c article --file /usr/local/article.json --headerline --type json --upsert --drop
# 说明
--drop 导之前先删除
--upsert 存在更新,不存在插入。

备份

1
$ mongodump -h dbhost -d dbname -o 目录路径

还原

1
$ mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径

卸载

1
2
3
$ sudo apt-get purge mongodb-org*
$ sudo rm -r /var/log/mongodb
$ sudo rm -r /var/lib/mongodb

命令行工具

1
2
3
4
5
6
7
8
9
10
11
# 使用默认端口连接MongoDB
$ mongo 192.168.1.100

# 连接MongoDB并指定端口
$ mongo 192.168.1.100:27017

# 连接到指定的MongoDB数据库
$ mongo 192.168.1.100:27017/test

# 指定用户名和密码连接到指定的MongoDB数据库
$ mongo 192.168.1.200:27017/test -u user -p password

可视化运维工具

名称 说明
MongoDB Cloud Manager MongoDB Cloud Manager是官方推出的运维自动化管理系统,是企业版才支持的功能,社区用户也可以下载试用。Cloud Manager 主要功能包括
- MongoDB 集群(复制集、分片)的自动化部署
- 集群监控、及报警定制
- 自动数据备份与还原
Download
Doc

部署MongoDB副本集

部署MongoDB分片

部署步骤

环境说明

  • 操作系统:CentOS7.2
  • 内核:4.15
角色 IP 主机名
配置服务器 192.168.1.91 node1
路由服务器 192.168.1.92 node2
分片服务器 192.168.1.93 node3
分片服务器 192.168.1.94 node4
分片服务器 192.168.1.95 node5

配置配置服务器

配置路由服务器

配置分片服务器

分片扩容

分片收缩

客户端

MongoDB客户端

客户端 说明
MongoDB Compass - 官网
Robo 3T - 官网
- 3T MongoChef for Mac (数据库管理工具)V4.5.1 破解版
MongoChef现已更名为Studio 3T。
NoSQL Manager for MongoDB Professional - 官网
Toad - 官网
Studio 3T https://studio3t.com/
NoSQLBooster https://nosqlbooster.com/
MongoDB Compass https://www.mongodb.com/products/compass
NoSQL Manager https://www.mongodbmanager.com/
Mongo Management Studio http://mms.litixsoft.de/

Ubuntu中安装Robo 3T

1
2
3
$ cd /usr/local
$ sudo wget https://download.robomongo.org/1.2.1/linux/robo3t-1.2.1-linux-x86_64-3e50a65.tar.gz
$ sudo tar -zxvf robo3t-1.2.1-linux-x86_64-3e50a65.tar.gz

进入安装目录,找到可执行文件,首先按住左键把它拖到桌面先不放开,然后按下Alt,此时出现一个菜单,选择“链接到此处”,松开之后就在桌面上创建好快捷方式。

常见问题

mongoexport导出csv中文乱码

工具 解决办法
notepad 编码 -> 转换为UTF-8 with BOM编码格式
sublime text File -> save with Encoding -> UTF-8 with BOM

Exception opening socket

问题说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.2.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_101]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_101]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_101]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_101]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_101]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_101]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-3.11.2.jar:na]
... 3 common frames omitted

原因分析

Spring Boot具有一项称为“自动配置”的功能。在这种情况下,一旦在类路径上检测到Mongo驱动程序,就会使用默认值激活MongoAutoConfiguration,该默认值指向localhost:27017。如果不希望这种行为,可以配置MongoDB的属性或禁用MongoAutoConfiguration。

参考 Connecting to a MongoDB Database ### 解决办法

1
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

参考

坚持原创技术分享,您的支持将鼓励我继续创作!
0%