SpringDataMongoDB#
编写Repository层,进行简单的CRUD#
spring-data-mongodb的用法和jpa是一样的,Spring很强大,一统天下
- 引入启动器
- 配置文件,和上面的一样
- 编写DAO层
public interface SpitRepository extends MongoRepository<Spit,String> {}
它内置了简单的增删改查的方法,可以分页,也可以使用Spring对jpql的高级封装比如findByXXX等
MongoTemplate的使用:#
更新#
如果被更新的文档没有该条记录,就会创建出这个field,然后赋值
Query query = new Query(); Criteria criteria = new Criteria(); query.addCriteria(Criteria.where("_id").is("5d50cee71e5a931d2cd72e43")); Update update = new Update(); update.set("key1","新的值"); // 只会更新满足条件的第一条 入参位置1 query作用: 根据条件找出对应的doc 入参位置2 update作用: 进行更新的操作 mongoTemplate.updateFirst(query,update,"集合");
使用下面的函数也能达到相同更新的效果
mongoTemplate.upsert(query,update,"集合");
批量更新:
批量更新满足条件的doc,只要前面的条件满足, 就会被更新, 不存在的字段会添加上去, 存在的被更新掉
Query query = new Query(); query.addCriteria(Criteria.where("nickname").is("恩恩")); Update update = new Update(); update.set("share","2"); // 同样, key8不存在,就新添加进去 // 只会更新满足条件的第一条 mongoTemplate.updateMulti(query,update,"spit");
仅仅更新满足条件的第一个
Query query = new Query(); query.addCriteria(Criteria.where("nickname").is("恩恩")); Update update = new Update(); update.set("share","2"); // 同样, key8不存在,就新添加进去 // 只会更新满足条件的第一条 mongoTemplate.updateFirst(query,update,"spit");
给指定的字段增加指定的数量, 注意点是, 如果尝试对字符串增加指定的数,不报错,但是也不会改变原来的值
Query query = new Query(); query.addCriteria(Criteria.where("_id").is("1")); Update update = new Update(); update.inc("thumbup",3); // 给指定的字段增加指定的数量 // 只会更新满足条件的第一条 mongoTemplate.updateFirst(query,update,"spit");
重命名文档的某个key
Query query = new Query(); Criteria criteria = new Criteria(); query.addCriteria(Criteria.where("_id").is("1")); Update update = new Update(); update.rename("_class","新的class"); // 给指定的字段增加指定的数量 // 只会更新满足条件的第一条 mongoTemplate.updateFirst(query,update,"spit");
移除key
update.unset("新的class");
在现有的文档基础上,嵌入文档
Query query = new Query(); Criteria criteria = new Criteria(); query.addCriteria(Criteria.where("_id").is("1")); Update update = new Update(); Spit spit = new Spit(); spit.set_id("666"); spit.setContent("我的被嵌套进来的文档"); update.addToSet("childSpit",spit); // 只会更新满足条件的第一条 mongoTemplate.updateFirst(query,update,"spit");
修改被嵌入的文档
Query query = new Query(); Criteria criteria = new Criteria(); // 通过 添加条件定位出 指定的嵌套文档 query.addCriteria(Criteria.where("_id").is("1").and("childSpit._id").is("666")); Update update = new Update(); // todo 通过这样条件 字段名.$.field update.set("childSpit.$.content","嵌套文档的conntent被改变了"); // 只会更新满足条件的第一条 mongoTemplate.updateFirst(query,update,"spit");
删除嵌套文档
Query query = new Query(); Criteria criteria = new Criteria(); // 通过 添加条件定位出 指定的嵌套文档 query.addCriteria(Criteria.where("_id").is("1").and("childSpit._id").is("666")); Update update = new Update(); update.unset("childSpit.$"); // 只会更新满足条件的第一条 mongoTemplate.updateFirst(query,update,"spit");
使用:MongoTemplate 提高效率的场景
在点赞的业务中,给某个帖子点赞的逻辑如下:
- 前端提交帖子的id, 后端根据id查询一次数据库,把帖子查出来
- 给帖子的赞数+1
- 把帖子更新进数据库
前前后后使用了两次查询,下面使用MongoTemplate,可以实现和数据库一次交互,完成更新
Query query = new Query(); query.addCriteria(Criteria.where("_id").is("前端提交的id")); Update update = new Update(); update.inc("赞的字段",1); // 自增1 mongoTemplate.updateFirst(query,update,"集合名字");