2018-12-25 · Develop

Spring Boot 集成 MongoDB

MongoDB 是由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统,支持的数据结构为 BSON 格式,并且提供丰富的查询功能,支持对数据建立索引。不需要提前提供数据结构。

安装

配置 yum 源

创建一个 /etc/yum.repos.d/mongodb-org-4.0.repo 文件来通过 yum 源进行安装 MongoDB。 具体的安装教程也可参考 MongoDB 的官方文档

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

安装 MongoDB 包

sudo yum install -y mongodb-org

修改配置文件

vim /etc/mongod.conf

启动

systemctl start mongod

Spring Boot 集成 MongoDB

Spring Boot 引入 spring-boot-starter-data-mongodb 来集成 MongoDB,一下是在 pom 中添加的内容:

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

除了依赖外,还需要配置 MongoDB 的链接地址

spring:
  data:
    mongodb:
      uri: mongodb://192.168.113.131:27017/lo

CRUD API

Spring Boot 使用 MongoTemplate 作为核心来进行增删改查操作, MongoTemplate 可以自动引入到 Spring 管理的 Bean 中。

创建一个实体

@Builder
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "lo_user")
public class User {
    @Id
    private Long id;
    private String name;
    private Long departmentId;
    private Date createTime;
}

可以通过注解 @Document 的 collection 属性设置 MongoDB 的 collection 名称,如果不指定将使用类名首字母小写作为 collection 名称。
@Id 可以指定和 MongoDB 中的主键 _id 对应的字段,默认使用 id 和 _id 进行对应的关系映射。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MongoTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void name() throws Exception {
        mongoTemplate.insert(
                User.builder()
                        .id(12L)
                        .name("TEST")
                        .departmentId(1L)
                        .createTime(new Date())
                        .build()
        );
    }
}

推荐使用图形管理工具 Robo 3T 进行查看会看到如下的结构

/* 1 */
{
    "_id" : NumberLong(12),
    "name" : "TEST",
    "departmentId" : NumberLong(1),
    "createTime" : ISODate("2018-12-19T01:51:03.017Z"),
    "_class" : "com.zuojl.lo.modules.sys.entity.User"
}

其他的添加、删除、修改以及一些高级的查询等功能都可以通过 MongoTemplate 来进行调用,如果你更喜欢使用底层驱动包中的 API 来访问 MongoDB(Spring Boot 使用的底层驱动包为 mongodb-driver-[version].jar), 可以使用 execute 方法来进行操作。

public <T> T execute(DbCallback<T> action)

DbCallback 提供了底层驱动的 MongoDatabase 类来访问 MongoDB

mongoTemplate.execute(new DbCallback<User>() {
    @Nullable
    @Override
    public User doInDB(MongoDatabase db) throws MongoException, DataAccessException {
        MongoCollection<Document> mongoCollection = db.getCollection("lo_user");
        Document document = mongoCollection.find(new Document("_id", 12L)).first();
        return JsonUtils.fromJson(document.toJson(), User.class);
    }
});

日志打印

mongoTemplate 提供了大量的 API 来访问 MongoDB, 通过配置日志等级可以很好的跟踪 mongoTemplate 的一些细节。

logging:
  level:
    org:
      springframework:
        data:
          mongodb: debug