Spring boot data mongodb入门

发布时间 2023-09-17 16:03:03作者: 心若向阳,次第花开

在Spring Boot中使用Mongodb,首先导入依赖库:

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

连接配置

## 阿里云副本实例连接
# spring.data.mongodb.uri=mongodb://账号:密码@dds-primary-pub.mongodb.rds.aliyuncs.com:3717,dds-secondary-pub.mongodb.rds.aliyuncs.com:3717/默认数据库?replicaSet=实例高可用连接地址的唯一标识ID
# spring.data.mongodb.database=默认数据库
# 本机单节点实例
spring.data.mongodb.uri=mongodb://localhost:27017/默认数据库
logging.level.root=info
# 打印SQL
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
 
实体定义:
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serial;
import java.io.Serializable;
import java.util.Date;

@Data
@Document("note")
public class Note implements Serializable {

@Serial
private static final long serialVersionUID = 5975169180210838347L;
// 主键自动生成
@Id
private String id;
    private String name;
    @Field("type")
private int type;

@Field("created_at")
private Date createdAt;

}

Repository定义:
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.Date;
import java.util.List;

public interface NoteRepository extends MongoRepository<Note, String> {
    // sort 1:asc,-1:desc
    // 注意引号的使用,否则会引起查询不到数据的问题
    @Query(value = "{'created_at':{$gte:?0,$lte:?1}}", sort = "{ created_at : -1 }")
    List<Note> findByCreateDTime(Date startDate, Date endDate);

    @Query(value = "{'name':{$regex:?0}}")
    List<Note> findByNameRegex(String name);

    @Query(value = "{'name':?0}")
    List<Note> findByName(String name);
    public long count();
}
 
入门整理,Service层就省略了,放到Controller
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;

import static java.lang.String.format;

@RestController
@RequestMapping("/note")
@Slf4j
public class NoteController {

    @Autowired
    private NoteRepository noteRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    // http://localhost:8080/note/list
    @GetMapping("/list")
    public Page<Note> getPageList() {
        return noteRepository.findAll(Pageable.ofSize(10));
    }

    // http://localhost:8080/note/id/64fa7d50c96b8b64535a04f9
    @GetMapping("/id/{id}")
    public Note getListById(@PathVariable String id) {
        return noteRepository.findById(id).orElseThrow(RuntimeException::new);
    }

    // http://localhost:8080/note/date/start/2018-11-07
    @GetMapping("/date/start/{date}")
    public List<Note> getListByCreatedTime(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
        // 复杂逻辑,建议使用这个方法
        Query query = new Query();
        query.addCriteria(Criteria.where("created_at").gte(date));
        List<Note> users = mongoTemplate.find(query, Note.class);
        return users;
    }

    @GetMapping("/date/range/{start}/{end}")
    public List<Note> getListByCreatedTimeUsQuery(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date start, @PathVariable(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date end) {
        if (end == null) {
            end = new Date();
        }
        return noteRepository.findByCreateDTime(start, end);
    }

    // http://localhost:8080/note/name/start/甲
    @GetMapping("/name/start/{name}")
    public List<Note> getListByStartName(@PathVariable String name) {
        return noteRepository.findByNameRegex(format("^%s", name));
    }

    // http://localhost:8080/note/name/end/??
    @GetMapping("/name/end/{name}")
    public List<Note> getListByEndName(@PathVariable String name) {
        return noteRepository.findByNameRegex(format("%s$", name));
    }

    // http://localhost:8080/note/name/??
    @GetMapping("/name/{name}")
    public List<Note> getListByName(@PathVariable String name) {
        return noteRepository.findByName(name);
    }
 
    @PostMapping("/add")
    public Note add(@RequestBody Note note) {
        return noteRepository.save(note);
    }
}
参考:
阿里云连接实例说明

   MongoDB Compass Download (GUI)

   Spring Data MongoDB - Reference Documentation