初探MongoDB

得闲,寻一数据库学习一番,突遇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试试,试试就逝世

  1. 随便找一个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>
  1. 创建一个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;
}
  1. 创建完之后发现,配置文件还没配,赶紧回去配,打开application.yml
  data:
    mongodb:
# 有两种方式,可以任选其一,不过我比较推荐第一种,因为第二种容易报错(我觉得第二种,更适合集群)
# 第一种配置:
      host: 你的host
      port: 27017
      database: test1
      username: admin
      password: admin
      authentication-database: admin
# 第二种配置:(我没成功,报错)
#      uri: mongodb://admin:admin@你的host:27017/test1
  1. 像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级别,那应该问题不大,所以我先看了看库里有没有加上这个索引,看了之后发现,的确有了:


DDL中可看到

不过既然提示了,那就看看能不能解决一下吧,度娘那找找答案去。
于是我找到了这篇文章
,借鉴一下他的方法:
也就是说我还得写个config了,好麻烦,等以后我试试吧。
总之这是个官方建议,如果真的用了注解来建索引,也不是不可以。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。