Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker DevOps


Spring Boot 使用 MongoTemplate 操作 MongoDB

MongoDB Spring Boot Java 评论 2 大约 3826 字

引入依赖

<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

阅读 19331 · 发布于 2020-05-09

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

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

扫描二维码关注我
昵称:
  • dsafds 2楼
    fdsfdsfd
    Chrome | Windows 10 2021-12-10
  • GTEGTSDGSD 1楼
    GSDFGSDGSD 
    Chrome | Windows 10 2021-10-20
随便看看 换一批