與HibernateRepository相似,經過繼承MongoRepository接口,咱們能夠很是方便地實現對一個對象的增刪改查,要使用Repository的功能,先繼承MongoRepository<T, TD>接口,其中T爲倉庫保存的bean類,TD爲該bean的惟一標識的類型,通常爲ObjectId。以後在service中注入該接口就能夠使用,無需實現裏面的方法,spring會根據定義的規則自動生成。java
例:spring
public interface PersonRepository extends MongoRepository < Person , ObjectId > { //這裏能夠添加額外的查詢方法 }
可是MongoRepository實現了的只是最基本的增刪改查的功能,要想增長額外的查詢方法,能夠按照如下規則定義接口的方法。自定義查詢方法,格式爲「findBy+字段名+方法後綴」,方法傳進的參數即字段的值,此外還支持分頁查詢,經過傳進一個Pageable對象,返回Page集合。mongodb
例:spa
public interface PersonRepository extends MongoRepository < Person , ObjectId > { //查詢大於age的數據 public Page < Product > findByAgeGreaterThan(int age,Pageable page) ; }
下面是支持的查詢類型,每三條數據分別對應:(方法後綴,方法例子,mongodb原生查詢語句)code
GreaterThan(大於)
findByAgeGreaterThan(int age)
{"age" : {"$gt" : age}} orm
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} ip
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);