Spring Boot 使用 MongoTemplate 操作 MongoDB

MongoDB Spring Boot Java About 3,826 words

引入依赖

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

添加配置

spring:
  data:
    mongodb:
      uri: mongodb://testUser:testPassword@192.168.1.101:27017/testDB

常用注解

@Document

使用@Document(org.springframework.data.mongodb.core.mapping.Document)标注Java的类名对应的MongoDB的集合名称。

@Id、@MongoId

使用@Id(org.springframework.data.annotation.Id)或@MongoId(低版本依赖可能需升级才有)映射MongoDB_id字段,若没有使用这两个注解,则字段中名称为id的字段将自动映射到_id上。使用这两个注解可标注的字段类型为StringObjectId(org.bson.types.ObjectId)。

@Field

使用@Field(org.springframework.data.mongodb.core.mapping.Field)字段,将Java类中字段名称与MongoDB集合中字段名称不一致的字段映射成一致的。如Java中使用了驼峰命名的startTs字段,想要映射成MongoDB中的start_ts字段就可以使用@Field完成。

@Transient

使用@Transient(org.springframework.data.annotation.Transient)标注该字段不持久化至数据库中。

示例

@Document("test_dto")
public class TestDto {

    @Id
    private String id;
//    @MongoId
//    private String id;

    @Field("create_ts")
    private long createTs;

    @Transient
    private String ignoreProperty;

}

MongoTemplate

注入MongoTemplate类可实现对MongoDB的增删改查操作。

查询条件

使用Query构建查询条件。示例如下:

_id等于具体值

Query query = Query.query(Criteria.where("_id").is("5e786517e9babf45a79fda46"));

status等于某个值,并且更新时间大于某个值

Query query = Query.query(Criteria.where("status").is("ONLINE").and("update_ts").lte(System.currentTimeMillis()));

skiplimit可用于分页查询,withSortOrder可用于排序(多个Order为组合排序)

Criteria criteria1 = Criteria.where("status").is("ONLINE");
Criteria criteria2 = Criteria.where("update_ts").lte(System.currentTimeMillis());
Query query = new Query();
query.addCriteria(criteria1);
query.addCriteria(criteria2);
query.skip(100);
query.limit(10);
query.with(Sort.by(Sort.Order.desc("_id"), Sort.Order.asc("create_ts")));

insertsave。两者区别如下:

  • 插入重复数据时:insertDuplicateKeyException提示主键重复;save对已存在的数据进行更新。
  • 批处理操作时:insert可以一次性插入整个数据,效率较高;save需遍历整个数据,一次插入或更新,效率较低。
public class TestService {

    @Resource
    private MongoTemplate mongoTemplate;

    public void add(TestDto TestDto) {
        mongoTemplate.insert(TestDto);
        //mongoTemplate.save(TestDto);
    }

}

可使用映射对象或Query对象,使用remove进行删除。

public class TestService {

    @Resource
    private MongoTemplate mongoTemplate;

    public void delete1() {
        TestDto testDto = TestDto.builder().id("5e786517e9babf45a79fda46").build();
        DeleteResult deleteResult = mongoTemplate.remove(testDto);
    }

    public void delete2() {
        Query query = Query.query(Criteria.where("_id").is("5e786517e9babf45a79fda46"));
        DeleteResult deleteResult = mongoTemplate.remove(query, TestDto.class);
    }

}

updateFirst更新一个,updateMulti更新多个。

public class TestService {

    @Resource
    private MongoTemplate mongoTemplate;

    public void update() {
        Query query = Query.query(Criteria.where("_id").is("5e786517e9babf45a79fda46"));
        Update update = Update.update("update_ts", System.currentTimeMillis())
                        .set("status", "ONLINE");
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, TestDto.class);

    }

}

find查询集合,findOne查询一个。

public class TestService {

    @Resource
    private MongoTemplate mongoTemplate;

    public void queryList() {
        Query query = Query.query(Criteria.where("status").is("ONLINE").and("update_ts").lte(System.currentTimeMillis()))
                .skip(1000)
                .limit(10)
                .with(Sort.by(Sort.Order.desc("_id")));
        List<TestDto> testDtos = mongoTemplate.find(query, TestDto.class);
    }

    public void queryOne() {
        Query query = Query.query(Criteria.where("_id").is("5e786517e9babf45a79fda46"));
        TestDto testDto = mongoTemplate.findOne(query, TestDto.class);
    }
}

官方文档

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#reference

Views: 24,576 · Posted: 2020-05-09

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh