spring boot 中使用mongoDB

spring boot 中使用mongoDB

添加依赖

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

配置 MongoDB 连接

spring:
  data:
    mongodb:
      uri: mongodb://test:test%2C123@localhost:27017/test?authSource=admin

创建实体类

package cn.com.rstone.apioarstone.mongodb.model.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Document(collection = "log")
@Data// 指定集合名
public class Log {
    
    @Id
    private String id;  //mongoDB中的id

    //使用 MongoDbConstant 中 type 的常量
    private String type;

    //controller 功能名字
    private String controllerName;

    //使用 MongoDbConstant 中 status 的常量
    //controller 执行:START、END
    private String status;
    
    private String userId;

    private String userName;

    private String sql;

    private  Long runTime;

    private String exception;

    private LocalDateTime createTime;

}

创建service

package cn.com.rstone.apioarstone.mongodb.service;

import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import jakarta.annotation.Resource;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class MongodbLogService {
    
    @Resource
    private MongoTemplate mongoTemplate;
    
//    @Autowired
//    private UserRepository userRepository;
    
    // 使用 MongoTemplate 的 CRUD 操作
    
    // 插入
    public Log insertUser(Log sqlLog) {
        return mongoTemplate.insert(sqlLog);
    }
    
    // 查询所有
    public List<Log> findAllSqlLog() {
        return mongoTemplate.findAll(Log.class);
    }
    
    // 条件查询
    public List<Log> findUsersByCondition(String username, int minAge) {
        Query query = new Query();
        query.addCriteria(Criteria.where("username").is(username)
                           .and("age").gte(minAge));
        return mongoTemplate.find(query, Log.class);
    }
    
    //更新
    public void updateUserName(String logId, String userName) {
        Query query = new Query(Criteria.where("_id").is(logId));
        Update update = new Update().set("userName", userName);
        mongoTemplate.updateFirst(query, update, Log.class);
    }
    
    // 删除
    public void deleteSqlLog(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        mongoTemplate.remove(query, Log.class);
    }
    
}

使用

package cn.com.rstone.apioarstone.system.controller;

import cn.com.rstone.apioarstone.common.BaseResponse;
import cn.com.rstone.apioarstone.common.ResultUtils;
import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import cn.com.rstone.apioarstone.mongodb.service.MongodbLogService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.LocalDateTime;

@RestController
@RequestMapping("/system/mongdblog")
public class MongodbLogController {

    @Resource
    private MongodbLogService mongodbSqlLogService;

    @PostMapping("/add")
    public BaseResponse<?> add(){
        Log sqlLog = new Log();
        sqlLog.setSql("select");
        sqlLog.setCreateTime(LocalDateTime.now());
        sqlLog.setUserId("2");
        sqlLog.setUserName("adong");
        mongodbSqlLogService.insertUser(sqlLog);
        return ResultUtils.success(true);
    }

    @GetMapping("/list")
    public BaseResponse<?> list(){
        return ResultUtils.success(mongodbSqlLogService.findAllSqlLog());
    }

}

配置 MongoDB 连接池

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/mydb
      # 连接池配置
      min-connections-per-host: 10
      max-connections-per-host: 100
      max-wait-time: 120000
      max-connection-idle-time: 60000
      max-connection-life-time: 0
      connect-timeout: 10000
      socket-timeout: 0

配置索引

 // 在实体类上配置索引
@Document(collection = "users")
@CompoundIndexes({
    @CompoundIndex(name = "idx_username_email", 
                  def = "{'username': 1, 'email': 1}", 
                  unique = true)
})
public class User {
    // ...
    
    @Indexed(unique = true)
    private String email;
    
    @Indexed
    private Integer age;
}

分页查询

import org.springframework.data.domain.*;

public Page<User> getUsersByPage(int page, int size) {
    Pageable pageable = PageRequest.of(page, size, Sort.by("createTime").descending());
    return userRepository.findAll(pageable);
}

监听器(审计功能)

import org.springframework.data.mongodb.core.mapping.event.*;

@Component
public class MongoEventListener extends AbstractMongoEventListener<User> {
    
    @Override
    public void onBeforeConvert(BeforeConvertEvent<User> event) {
        User user = event.getSource();
        if (user.getCreateTime() == null) {
            user.setCreateTime(new Date());
        }
    }
    
    @Override
    public void onAfterSave(AfterSaveEvent<User> event) {
        // 保存后的操作
    }
}

# spring boot 中使用mongoDB

## 添加依赖

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

## 配置 MongoDB 连接

```yaml
spring:
  data:
    mongodb:
      uri: mongodb://test:test%2C123@localhost:27017/test?authSource=admin
```

## 创建实体类

```java
package cn.com.rstone.apioarstone.mongodb.model.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Document(collection = "log")
@Data// 指定集合名
public class Log {
    
    @Id
    private String id;  //mongoDB中的id

    //使用 MongoDbConstant 中 type 的常量
    private String type;

    //controller 功能名字
    private String controllerName;

    //使用 MongoDbConstant 中 status 的常量
    //controller 执行:START、END
    private String status;
    
    private String userId;

    private String userName;

    private String sql;

    private  Long runTime;

    private String exception;

    private LocalDateTime createTime;

}
```

## 创建service

```
package cn.com.rstone.apioarstone.mongodb.service;

import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import jakarta.annotation.Resource;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class MongodbLogService {
    
    @Resource
    private MongoTemplate mongoTemplate;
    
//    @Autowired
//    private UserRepository userRepository;
    
    // 使用 MongoTemplate 的 CRUD 操作
    
    // 插入
    public Log insertUser(Log sqlLog) {
        return mongoTemplate.insert(sqlLog);
    }
    
    // 查询所有
    public List<Log> findAllSqlLog() {
        return mongoTemplate.findAll(Log.class);
    }
    
    // 条件查询
    public List<Log> findUsersByCondition(String username, int minAge) {
        Query query = new Query();
        query.addCriteria(Criteria.where("username").is(username)
                           .and("age").gte(minAge));
        return mongoTemplate.find(query, Log.class);
    }
    
    //更新
    public void updateUserName(String logId, String userName) {
        Query query = new Query(Criteria.where("_id").is(logId));
        Update update = new Update().set("userName", userName);
        mongoTemplate.updateFirst(query, update, Log.class);
    }
    
    // 删除
    public void deleteSqlLog(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        mongoTemplate.remove(query, Log.class);
    }
    
}
```

## 使用

```java
package cn.com.rstone.apioarstone.system.controller;

import cn.com.rstone.apioarstone.common.BaseResponse;
import cn.com.rstone.apioarstone.common.ResultUtils;
import cn.com.rstone.apioarstone.mongodb.model.entity.Log;
import cn.com.rstone.apioarstone.mongodb.service.MongodbLogService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.LocalDateTime;

@RestController
@RequestMapping("/system/mongdblog")
public class MongodbLogController {

    @Resource
    private MongodbLogService mongodbSqlLogService;

    @PostMapping("/add")
    public BaseResponse<?> add(){
        Log sqlLog = new Log();
        sqlLog.setSql("select");
        sqlLog.setCreateTime(LocalDateTime.now());
        sqlLog.setUserId("2");
        sqlLog.setUserName("adong");
        mongodbSqlLogService.insertUser(sqlLog);
        return ResultUtils.success(true);
    }

    @GetMapping("/list")
    public BaseResponse<?> list(){
        return ResultUtils.success(mongodbSqlLogService.findAllSqlLog());
    }

}

```

## **配置 MongoDB 连接池**

```yaml
spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/mydb
      # 连接池配置
      min-connections-per-host: 10
      max-connections-per-host: 100
      max-wait-time: 120000
      max-connection-idle-time: 60000
      max-connection-life-time: 0
      connect-timeout: 10000
      socket-timeout: 0
```

## 配置索引

```java
 // 在实体类上配置索引
@Document(collection = "users")
@CompoundIndexes({
    @CompoundIndex(name = "idx_username_email", 
                  def = "{'username': 1, 'email': 1}", 
                  unique = true)
})
public class User {
    // ...
    
    @Indexed(unique = true)
    private String email;
    
    @Indexed
    private Integer age;
}
```

## **分页查询**

```java
import org.springframework.data.domain.*;

public Page<User> getUsersByPage(int page, int size) {
    Pageable pageable = PageRequest.of(page, size, Sort.by("createTime").descending());
    return userRepository.findAll(pageable);
}
```

## 监听器(审计功能)

```java
import org.springframework.data.mongodb.core.mapping.event.*;

@Component
public class MongoEventListener extends AbstractMongoEventListener<User> {
    
    @Override
    public void onBeforeConvert(BeforeConvertEvent<User> event) {
        User user = event.getSource();
        if (user.getCreateTime() == null) {
            user.setCreateTime(new Date());
        }
    }
    
    @Override
    public void onAfterSave(AfterSaveEvent<User> event) {
        // 保存后的操作
    }
}
```