常用注解:
@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