得闲,寻一数据库学习一番,突遇mongo,早有耳闻,今有空钻研,耍耍。
一、比较懒,所以用 docker 部署 mongoDB
1. 打开docker hub官网找到 mongodb 或者输入命令 docker search mongodb
2. 下载镜像:docker pull mongo (或者一步到位,直接执行第三步)
3. 运行镜像容器:
docker run -d --name my-mongo -p 27017:27017 -v $PWD/mongo/data/db:/data/db mongo
4. 容器启动成功后,可以先用navicat连接测试一下,然后会发现不需要登录,这是因为还没有创建用户
# 使用docker exec 进入容器内部,进一步创建用户
docker exec -it my-mongo mongo admin
# 创建一个名为 admin,密码为 admin 的用户。
> db.createUser({ user:'admin',pwd:'admin',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', 'admin')
自此,这个admin用户就创建好了(具体请参考菜鸟教程)
二、整合spring boot试试,试试就逝世
- 随便找一个2.X以上版本的spring boot项目,在pom文件引入依赖
<!--MongoDB-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
- 创建一个POJO,用来往mongo里存数据,
@Data
// 表示这个对象对应的是mongodb库里的mongo_test集合(mongo把表称为集合,其实都一个意思)
@Document(collection = "mongo_test")
public class MongoEntity implements Serializable {
private String name;
/**
* @Indexed 设为索引 到后来发现,mongo 3.x以上的版本不推荐这么建索引,所以可以不加这个注解
* unique = true 唯一索引(即:不可重复)
*/
@Indexed(unique = true)
private String certCode;
private Integer age;
private Date createTime;
private Date updateTime;
}
- 创建完之后发现,配置文件还没配,赶紧回去配,打开application.yml
data:
mongodb:
# 有两种方式,可以任选其一,不过我比较推荐第一种,因为第二种容易报错(我觉得第二种,更适合集群)
# 第一种配置:
host: 你的host
port: 27017
database: test1
username: admin
password: admin
authentication-database: admin
# 第二种配置:(我没成功,报错)
# uri: mongodb://admin:admin@你的host:27017/test1
- 像redis一样,mongo也有自己的Template ,MongoTemplate
// 首先要注入进来
@Resource
MongoTemplate mongoTemplate;
//比如我要查集合下所有数据
List<MongoEntity> allInfo = mongoTemplate.findAll(MongoEntity.class);
//又或者我要新增数据
mongoTemplate.insert(mongo);
和redis一样,Template中的方法命名几乎都是和其命令是一样的。因此熟悉命令后,调用方法也运用自如。
详情请参考荒天帝886的文章
三、能一帆风顺来到你面前的不是成功,而是一堆堆报错(避坑指南)
1. 配置文件的配置很少,却容易失败。
如果你用第二种单uri的配置可能出现以下报错:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.'
MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='admin', source='test1', password=<hidden>, mechanismProperties=<hidden>}
提示我password是空的,行,那我去找找大神们是怎么配的,难道我格式不对?于是我点开了这篇文章。
然后证实了,我的配置是正确的(因为在配之前就已经查阅过资料了)。这个见鬼的问题目前我还没弄明白(你们谁知道,可以留言告诉我),所以为了能快点使用mongo,经过多方查找,我找到了第一种配置方法,结果成功了。
2. 加索引的问题
起初我是在项目运行时的日志里看到的,他是这么说的:
2020-09-10 11:36:15.444 WARN 12924 --- [ main] .m.c.i.MongoPersistentEntityIndexCreator : Automatic index creation will be disabled by default as of Spring Data MongoDB 3.x.
Please use 'MongoMappingContext#setAutoIndexCreation(boolean)' or override 'MongoConfigurationSupport#autoIndexCreation()' to be explicit.
However, we recommend setting up indices manually in an application ready block. You may use index derivation there as well.
> -----------------------------------------------------------------------------------------
> @EventListener(ApplicationReadyEvent.class)
> public void initIndicesAfterStartup() {
>
> IndexOperations indexOps = mongoTemplate.indexOps(DomainType.class);
>
> IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
> resolver.resolveIndexFor(DomainType.class).forEach(indexOps::ensureIndex);
> }
> -----------------------------------------------------------------------------------------
大致意思就是,3.x以后的版本,不能自动给你建索引了,你最好自己手动建一个。看完之后,我想既然WARN级别,那应该问题不大,所以我先看了看库里有没有加上这个索引,看了之后发现,的确有了:
不过既然提示了,那就看看能不能解决一下吧,度娘那找找答案去。
于是我找到了这篇文章
,借鉴一下他的方法:
也就是说我还得写个config了,好麻烦,等以后我试试吧。
总之这是个官方建议,如果真的用了注解来建索引,也不是不可以。