众妙之门

业精于勤,荒于嬉;行成于思,毁于随

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

常用注解:

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

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

@Indexed
声明该字段需要索引,建索引可以大大的提高查询效率。

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

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

@DBRef

@Data
@Document("test_dto")
public class TestDto {

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

    @Indexed
    private Integer status;

    @Field("create_ts")
    private Long createTs;

    @Transient
    private String ignoreProperty;

    @DBRef
    private List<ThirdParty> thirdParties;

}

MongoTemplate的操作

常用方法

:insert和save。两者区别如下:

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

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

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

updateFirst更新一个,update更新所有符合条件的。


声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存。

举个栗子:

// 1 新增
mongoTemplate.insert(Student.class);
mongoTemplate.save(Student.class);
mongoTemplate.insertAll(new ArrayList<Student>());
 // 2 修改
mongoTemplate.update(Student.class);
mongoTemplate.updateFirst(new Query(), new Update(), Student.class);
// 3 删除
mongoTemplate.remove(Student.class);
mongoTemplate.remove(new Query(), Student.class);
mongoTemplate.findAndRemove(new Query(), Student.class);
// 4 查询
mongoTemplate.find(new Query(), Student.class);
mongoTemplate.findById("id", Student.class);
mongoTemplate.findAll(Student.class);
// 5 统计
mongoTemplate.count(new Query(),Student.class);

查询条件

使用Query构建查询条件。Query对象是一个查询对象,用来封装给所有的条件对象;再创建一个criteria对象,用来封装所有的查询条件(类似通用mapper中的功能)

创建Query对象
Query query = new Query(criteria);

创建Criteria对象方法

直接new对象 Criteria criteria = new Criteria();

通过Criteria.where()静态方法创建 Criteria.where(“属性名”).is(“值”)(criteria.and().is()与criteria.where().is()都可以进行查询,但两种方式不能混合使用,否则不生效。)

精确查询 criteria.and(“属性名”).is(“值”);

模糊条件 criteria.and(“属性名”).regex(“值”)

Pattern pattern=Pattern.compile("^.*"+taskTypeCode+".*$", Pattern.CASE_INSENSITIVE);
criteria.and("taskTypeCode").regex(pattern);

范围查询,根据日期时间进行范围查询(其中gt为大于,lte为小等于);

SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
criteria.and("createTime").gt(format.parse(createTime));
criteria.and("endTime").lte(format.parse(endTime));

or查询,在MongoTemplate 中 or 是用 orOperator表示的;

new Criteria().and("orderId").is(item.getOrderId())
        .orOperator(
                Criteria.where("status").is(1),
                Criteria.where("status").is(null)
        );

将查询条件装载到query中

query.addCriteria(criteria);

排序 通过参数 direction 判断排序方向,sortField 为排序字段

query.with(new Sort(direction, sortField));

分页,有两种方式,一种是通过pageable 一种是 limit().skip();limit表示查询多少数据,skip表示从哪条数据查起

//第一种
Pageable pageable = new PageRequest(page, size, new Sort(new Sort.Order(direction, sortField)));
query.with(pageable);
long totoal = this.mongoTemplate.count(query, TaskMongo.class);
List<TaskMongo> listTaskMongo = this.mongoTemplate.find(query , TaskMongo.class);
//第二种
query.limit(5000).skip(5000);
List<TaskMongo> listTaskMongo = this.mongoTemplate.find(query , TaskMongo.class);

转载:https://www.cnblogs.com/wangzhebin/p/16416971.html

posted on 2023-01-05 10:50  xuanm  阅读(1055)  评论(0编辑  收藏  举报