MongoRepository怎么修改数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoRepository怎么修改数据相关的知识,希望对你有一定的参考价值。

与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使
用Repository的功能,先继承MongoRepository<T,
TD>接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以
使用,无需实现里面的方法,spring会根据定义的规则自动生成。

例:

public interface PersonRepository extends

MongoRepository<Person, ObjectId>
//这里可以添加额外的查询方法


但是MongoRepository实现了的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方
法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable对象,返回Page集合。

例:

public interface PersonRepository extends

MongoRepository<Person, ObjectId>
//查询大于age的数据
public Page<Product> findByAgeGreaterThan(int age,Pageable page) ;


下面是支持的查询类型,每三条数据分别对应:(方法后缀,方法例子,mongodb原生查询语句)

GreaterThan(大于)
findByAgeGreaterThan(int age)
"age" : "$gt" : age

LessThan(小于)
findByAgeLessThan(int age)
"age" : "$lt" : age

Between(在...之间)
findByAgeBetween(int from, int to)
"age" : "$gt" : from, "$lt" : to

IsNotNull, NotNull(是否非空)
findByFirstnameNotNull()
"age" : "$ne" : null

IsNull, Null(是否为空)
findByFirstnameNull()
"age" : null

Like(模糊查询)
findByFirstnameLike(String name)
"age" : age ( age as regex)

(No keyword) findByFirstname(String name)
"age" : name

Not(不包含)
findByFirstnameNot(String name)
"age" : "$ne" : name

Near(查询地理位置相近的)
findByLocationNear(Point point)
"location" : "$near" : [x,y]

Within(在地理位置范围内的)
findByLocationWithin(Circle circle)
"location" : "$within" : "$center" : [ [x, y], distance]

Within(在地理位置范围内的)
findByLocationWithin(Box box)
"location" : "$within" : "$box" : [ [x1, y1], x2, y2]

尽管以上查询功能已经很丰富,但如果还不能满足使用情况的话可以用一下方法---基于mongodb原本查询语句的查询方式。
例:在原接口中加入

@Query(" 'name':'$regex':?2,'$options':'i', sales': '$gte':?1,'$lte':?2")
public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);

注释Query里面的就是mongodb原来的查询语法,我们可以定义传进来的查询参数,通过坐标定义方法的参数。

还可以在后面指定要返回的数据字段,如上面的例子修改如下,则只通过person表里面的name和age字段构建person对象。

@Query(value=" 'name':'$regex':?2,'$options':'i', sales':'$gte':?1,'$lte':?2",fields=" 'name' : 1, 'age' : 1")
public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
参考技术A 没有用spring提供的MongoRepository接口,他好像没有提供较复杂的更新数据方法,我使用了org.springframework.data.mongodb.core.MongoOperations这个类,它提供了更新方法

eg:
/**
* 把name的mail订阅状态更新为flag
*/
public void updateMailFlag(String name, String flag) throws Exception
opterations.updateFirst(new Query(new Criteria("name").is(name)),
new Update().set("flag", flag), EmailInfo.class);
本回答被提问者和网友采纳
参考技术B 可以使用
MongoRepository中的
save()来进行更新操作,不过注意哦,实体类中需要声明iD哦,不然是不会对原有记录进行覆盖的

以上是关于MongoRepository怎么修改数据的主要内容,如果未能解决你的问题,请参考以下文章

解决SpringBoot 整合 MongoDB,继承MongoRepository的Repo接口无法注入异常

解决SpringBoot 整合 MongoDB,继承MongoRepository的Repo接口无法注入异常

如何在使用带有 Spring 数据的 MongoRepository 的查询注释时显示查询

MongoRepository 比较了两列 + Spring Data

MongDB .Net工具库MongoRepository的简单使用

MongoRepository Save 方法不插入数据库