首页 > 技术文章 > SpringBoot 整合MongoDB

ruhuanxingyun 2021-04-10 10:11 原文

1. pom.xml Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2. application.yml 配置文件

spring:
  data:
    mongodb:
      host: 127.0.0.1
      port: 27017
      username: root
      password: 123456
      # 认证库(验证用户名和密码)
      authentication-database: admin
      # 操作库
      database: db

3. 配置类

package com.ruhuanxingyun.dcy.service.manage.config;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.convert.*;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

/**
 * @description: MongoDB 配置类
 * @author: ruphie
 * @date: Create in 2021/4/11 14:06
 * @company: ruhuanxingyun
 */
@Configuration
public class MongoConfig {

    /**
     * 去掉_class字段
     *
     * @param factory     MongoDatabaseFactory
     * @param context     MongoMappingContext
     * @param beanFactory BeanFactory
     * @return MappingMongoConverter
     */
    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, context);
        // 若选择CustomConversions类,需要注意继承类就一个才可以,否则启动报错,本项目还有redis,所以要用MongoCustomConversions类
        mappingMongoConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class));
        // 去掉数据库中的_class字段,_class字段旨在把document转换成Java对象时能够转换到具体的子类
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return mappingMongoConverter;
    }

}

4. 注解

  A. @Document:把一个java类声明为mongodb文档,其中collection参数代表文档,如果未指明collection,默认是类名;

  B. @Id:文档的唯一标识,在mongodb中为ObjectId,由时间戳+机器标识+进程ID+自增计数器构成;

  C. @Transient:忽略该字段序列化到mongodb中;

  D. @Indexed:声明该字段需要索引;

  E. @CompoundIndex:复合索引的声明;

  注意:实体映射是通过MappingMongoConverter类实现的。

5. 常见问题

  A. 问题一:连接MongoDB认证异常;

      原因:在admin库中创建的用户,需要去admin库认证,然后才能访问其他库;

    解决方式:在application.yml配置文件中添加spring.data.mongodb.authentication-database=admin即可。

  B. 问题二:新增一条记录时报InvalidDataAccessApiUsageException异常;

 

     原因:MongoDB无法为实体自动生成java.lang.Long类型的ID,默认的集合主键_id是ObjectId类型;

   解决方式:若使用数据库_id字段,就将类型改为string。

  

可参考:SpringBoot整合MongoDB

 

推荐阅读