====== Description ======
Spring Data MongoDB도 Spring Data repository 추상화 인터페이스를 지원한다. 이에 대한 내용은 Spring Data JPA 가이드 중 [[egovframework:rte2:psl:data:jpa:repository|Repository]] 부분을 참조한다.
====== 1. 시작하기 ======
MongoDB에 대한 repository를 사용하기 위해서는 다음과 같은 mongo schem의 repistories 설정이 필요하다.
===== Domain Object 생성 =====
일반적인 POJO를 통해 MongoDB에 문서를 저장한다.
public class Person {
@Id
private String id;
private String firstname;
private String lastname;
private Address address;
private double[] location;
...
// getters/setters
===== 기본 repository interface =====
public interface PersonRepository extends MongoRepository {
// additional custom finder methods go here
}
===== Paging 처리 =====
MongoRepository interface는 기본적으로 PagingAndSortingRepository를 extends하기 때문에 다음과 같은 기본 페이징 처리를 지원한다.
@Autowired
private PersonRepository repository;
...
@Test
public void readsFirstPageCorrectly() {
Page persons = repository.findAll(new PageRequest(0, 10));
LOGGER.info("Persons Total elements : " + persons.getTotalElements());
assertTrue(persons.isFirst());
}
====== 2. Query methods ======
Repository는 Spring Data에서 제공되는 keyword 기반의 query method를 사용할 수 있다.
ex:
public interface PersonRepository extends MongoRepository {
List findByLastname(String lastname);
Page findByFirstname(String firstname, Pageable pageable);
Person findByShippingAddresses(Address address);
}
지원되는 keyword는 다음과 같다.
^ Keyword ^ Sample ^ Logic result ^
| GreaterThan |findByAgeGreaterThan(int age) |{"age" : {"$gt" : age}} |
| GreaterThanEqual |findByAgeGreaterThanEqual(int age) |{"age" : {"$gte" : age}} |
| LessThan |findByAgeLessThan(int age) |{"age" : {"$lt" : age}} |
| LessThanEqual |findByAgeLessThanEqual(int age) |{"age" : {"$lte" : age}} |
| Between |findByAgeBetween(int from, int to) |{"age" : {"$gt" : from, "$lt" : to}} |
| In |findByAgeIn(Collection ages) |{"age" : {"$in" : [ages...]}} |
| NotIn |findByAgeNotIn(Collection ages) |"age" : {"$nin" : [ages...]}} |
| IsNotNull, NotNull |findByFirstnameNotNull() |{"age" : {"$ne" : null}} |
| IsNull, Null |findByFirstnameNull() |{"age" : null} |
| Like |findByFirstnameLike(String name) |{"age" : age} ( age as regex) |
| Regex |findByFirstnameRegex(String firstname) |{"firstname" : {"$regex" : firstname }} |
| (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]}}} |
| IsTrue, True |findByActiveIsTrue() |{"active" : true} |
| IsFalse, False |findByActiveIsFalse() |{"active" : false} |
| Exists |findByLocationExists(boolean exists) |{"location" : {"$exists" : exists }} |
====== 3. Repository delete queries ======
위의 keyword를 delete..By 또는 remove..By 형태로 사용하는 경우 삭제 처리가 가능하다.
public interface PersonRepository extends MongoRepository {
List deleteByLastname(String lastname);
Long deletePersonByLastname(String lastname);
}
====== 4. Geo-spatial repository queries ======
Near keyword를 사용하는 경우 geo-spatial 처리와 관련된 query도 처리 가능하다.
public interface PersonRepository extends MongoRepository
// { 'location' : { '$near' : [point.x, point.y], '$maxDistance' : distance}}
List findByLocationNear(Point location, Distance distance);
}
====== 5. MongoDB JSON based query methods ======
org.springframework.data.mongodb.repository.Query anntation을 사용할 경우 JSON query 방식을 통해 직접 query를 지정할 수 있다.
public interface PersonRepository extends MongoRepository
@Query("{ 'firstname' : ?0 }")
List findByThePersonsFirstname(String firstname);
}