2.6. Mongodb 쿼리

Mongodb 모듈의 조회 기능을 설명한다.

2.6.1. 메이븐 통합

메이븐 프로젝트에 다음 의존을 추가한다.

<dependency>
  <groupId>com.mysema.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
  <version>${querydsl.version}</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>com.mysema.querydsl</groupId>
  <artifactId>querydsl-mongodb</artifactId>
  <version>${querydsl.version}</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.1</version>
</dependency>

Querydsl을 이용해서 쿼리 타입을 생성하기 위해 메이븐 APT 플러그인을 설정한다.

<project>
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <outputDirectory>target/generated-sources/java</outputDirectory>
              <processor>com.mysema.query.apt.morphia.MorphiaAnnotationProcessor</processor>
            </configuration>
          </execution>
        </executions>
      </plugin>
    ...
    </plugins>
  </build>
</project>

MorphiaAnnotationProcessor는 com.google.code.morphia.annotations.Entity 애노테이션이 적용된 도메인 타입을 위한 Querydsl 쿼리 타입을 생성한다.

mvn clean install 을 실행하면 target/generated-sources/java 폴더에 쿼라 타입 코드가 생성된다.

이클립스를 사용중이면, mvn eclipse:eclipse 을 실행해서 target/generated-sources/java을 이클립스 프로젝트의 소스 폴더에 포함시킨다.

이제 쿼리 도메인 모델을 이용해서 Mongodb를 조회할 수 있다.

2.6.2. 쿼리

Querydsl Mongodb를 이용하면 다음과 같이 간단하게 쿼리할 수 있다.

Morphia morphia;
Datastore datastore;
// ...
QUser user = new QUser("user");
MorphiaQuery<User> query = new MorphiaQuery<User>(morphia, datastore, user);
List<User> list = query
    .where(user.firstName.eq("Bob"))
    .list();

2.6.3. 일반 용법

MongodbQuery 클래스의 cascading 메서드는 다음과 같다.

where: 쿼리 필터를 추가한다. 가변인자나 and/or 메서드를 이용해서 필터를 추가한다. PStrings에 수행되는 오퍼레이션을 지원한다. (matches, indexOf, charAt은 제외). 현재 in은 지원되지 않으며, 향후 지원할 예정이다.

orderBy: 정렬 표현식을 이용해서 정렬 순서를 지정한다. 숫자나 문자열에 대해서는 asc()나 desc()를 사용하고, OrderSpecifier에 접근하기 위해 다른 비교 표현식을 사용한다.

limit, offset, restrict: 결과의 페이징을 설정한다. limit은 최대 결과 개수, offset은 결과의 시작 행, restrict는 limit과 offset을 함께 정의한다.

2.6.4. 정렬

정렬 구문은 다음과 같다.

query
    .where(doc.title.like("*"))
    .orderBy(doc.title.asc(), doc.year.desc())
    .list();

title과 year의 오름차순으로 결과를 정렬한다.

2.6.5. 결과 개수 제한

다음과 같이 결과 개수를 제한한다.

query
    .where(doc.title.like("*"))
    .limit(10)
    .list();

2.6.6. 오프셋

다음과 같이 오프셋을 지정한다.

query
    .where(doc.title.like("*"))
    .offset(3)
    .list();

2.6.7. 공간(Geospatial) 쿼리

near(Double[]) 메서드를 이용해서 공간 검색을 할 수 있다.

query
    .where(geoEntity.location.near(50.0, 50.0))
    .list();

2.6.8. 관련 필드만 선택하기

관련 필드만 선택하고 싶다면, 선택 대상 목록을 갖는 list, iterate, uniqueResult, singleResult 메서드를 사용하면 된다.

query
    .where(doc.title.like("*"))
    .list(doc.title, doc.path);

이 쿼리는 문서의 title과 path 필드만 조회한다.