====== 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); }