AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

쿼리 결과 수정

이 가이드 에서는 최대 절전 모드 ORM용 MongoDB 확장을 사용하여 쿼리 결과를 정렬, 건너뛰기, 제한 및 그룹 방법을 학습 수 있습니다.

쿼리 성명서 에서 order by 절을 사용하여 지정된 필드 의 값을 기준으로 쿼리 결과를 정렬할 수 있습니다. 기본값 으로 order by 절은 문서를 오름차순으로 정렬합니다. 문서를 내림차순으로 정렬하려면 필드 이름에 desc 키워드를 추가합니다.

다음 예시 sample_mflix.movies 컬렉션 에서 일치하는 문서를 조회하고 year 필드 기준으로 내림차순으로 정렬합니다.

var sortResult = session.createQuery("from Movie where title = :t order by year desc", Movie.class)
.setParameter("t", "Cinderella")
.getResultList();
for (var m : sortResult) {
System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());
}
var sortResult = entityManager.createQuery("select m from Movie m where m.title = :t order by m.year desc", Movie.class)
.setParameter("t", "Cinderella")
.getResultList();
for (var m : sortResult) {
System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());
}

setFirstResult() 메서드를 쿼리 에 연결하여 쿼리 결과에서 지정된 수의 문서를 건너뛸 수 있습니다. 건너뛸 초기 문서 수를 이 메서드에 인수로 전달합니다.

다음 예시는 앞의 예시 와 동일한 쿼리를 실행하지만 결과에서 일치하는 첫 번째 문서를 건너뜁니다.

var skipResult = session.createQuery("from Movie where title = :t order by year desc", Movie.class)
.setParameter("t", "Cinderella")
.setFirstResult(1)
.getResultList();
for (var m : skipResult) {
System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());
}
var skipResult = entityManager.createQuery("select m from Movie m where m.title = :t order by m.year desc", Movie.class)
.setParameter("t", "Cinderella")
.setFirstResult(1)
.getResultList();
for (var m : skipResult) {
System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());
}

setMaxResults() 메서드를 쿼리 에 연결하여 쿼리 반환하는 문서 수를 제한할 수 있습니다. 반환할 최대 문서 수를 이 메서드에 인수로 전달합니다.

다음 예시 정렬 예시 와 동일한 쿼리 실행하지만 결과에 일치하는 문서를 최대 두 개 반환합니다.

var limitResult = session.createQuery("from Movie where title = :t order by year desc", Movie.class)
.setParameter("t", "Cinderella")
.setMaxResults(2)
.getResultList();
for (var m : limitResult) {
System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());
}
var limitResult = entityManager.createQuery("select m from Movie m where m.title = :t order by m.year desc", Movie.class)
.setParameter("t", "Cinderella")
.setMaxResults(2)
.getResultList();
for (var m : limitResult) {
System.out.println("Title: " + m.getTitle() + ", Year: " + m.getYear());
}

또는 다음 코드와 같이 HQL 또는 JPQL 성명서 에 limit 절을 사용하여 쿼리 반환하는 문서 수를 제한할 수 있습니다.

var limitClauseResult = session.createQuery("from Movie where title = :t order by year desc limit 2", Movie.class)
.setParameter("t", "Cinderella")
.getResultList();
var limitClauseResult = entityManager.createQuery("select m from Movie m where m.title = :t order by m.year desc limit 2", Movie.class)
.setParameter("t", "Cinderella")
.getResultList();

쿼리 성명서 에 group by 절을 사용하여 값을 주식 문서를 단일 결과 행으로 축소할 수 있습니다. 최대 절전 모드 ORM 확장은 group by 절을 MongoDB $ 그룹 단계로 변환하며, 여기서 각 그룹화 키가 _id 필드 의 하위 필드가 됩니다.

중요

그룹화 키 요구 사항

그룹화된 쿼리 의 select, having 또는 order by 절에서 참조하는 모든 필드 그룹화 키 또는 그 일부여야 합니다. $group 단계가 생성하지 않는 필드 참조하는 경우 하이버네이트 ORM 확장은 FeatureNotSupportedException를 발생시킵니다.

그룹화된 쿼리 distinct 키워드도 사용할 수 없습니다.

하나 이상의 필드 값을 기준으로 결과를 그룹 하려면 group by 절에 필드를 나열합니다. 여러 필드를 기준으로 그룹 하려면 필드 이름을 쉼표로 구분합니다.

이 예시 다음 작업을 수행합니다.

  • sample_mflix.movies 컬렉션 에서 title 값이 "Hairspray"인 문서를 검색합니다.

  • year 필드 기준으로 영화를 그룹화하며, 각 출시하다 연도에 대해 하나의 행을 반환합니다.

  • 결과를 year 값을 기준으로 오름차순으로 정렬합니다.

var groupResult = session.createQuery(
"select year from Movie where title = :title group by year order by year",
Integer.class)
.setParameter("title", "Hairspray")
.getResultList();
for (var year : groupResult) {
System.out.println("Year: " + year);
}
var groupResult = entityManager.createQuery(
"select m.year from Movie m where m.title = :title group by m.year order by m.year",
Integer.class)
.setParameter("title", "Hairspray")
.getResultList();
for (var year : groupResult) {
System.out.println("Year: " + year);
}

하이버네이트 ORM 확장은 이 쿼리 다음 파이프라인 으로 변환합니다. where 절은 그룹화하기 전에 실행되는 $match 단계가 됩니다. order by 절은 그룹화 키를 기준으로 정렬하는 $sort 단계가 됩니다.

[
{ "$match": { "title": { "$eq": "Hairspray" } } },
{ "$group": { "_id": { "year": "$year" } } },
{ "$sort": { "_id.year": 1 } },
{ "$project": { "_id#year": "$_id.year", "_id": 0 } }
]

그룹화 키는 필드 참조 대신 계산된 표현식 일 수 있습니다. 하이버네이트 ORM 확장은 k<n>이라는 이름의 생성된 _id 하위 필드에 표현식 저장합니다. select 또는 having 절에 동일한 표현식 쓰기 (write) 하면 하이버네이트 ORM 확장이 이를 다시 계산하지 않고 해당 하위 필드로 해석합니다.

하이버네이트 ORM 확장은 그룹화 키를 동일하게 쓰기 (write) 경우에만 표현식 그룹화 키와 일치시킵니다. 예시 들어 year + 1 의 키가 1 + year 의 발생과 일치하지 않습니다.

계산된 표현식 키로 정렬할 수도 있습니다. group by 절에 쓰기 (write) 것과 정확히 동일한 order by 절에 표현식 작성합니다.

다음 예시 "Hairspray"의 title가 있는 문서를 릴리스된 연도별로 그룹화하고 결과를 오름차순으로 정렬합니다.

var groupExpressionResult = session.createQuery(
"select year / 10 * 10 from Movie where title = :title group by year / 10 * 10 order by year / 10 * 10",
Integer.class)
.setParameter("title", "Hairspray")
.getResultList();
for (var decade : groupExpressionResult) {
System.out.println("Decade: " + decade);
}
var groupExpressionResult = entityManager.createQuery(
"select m.year / 10 * 10 from Movie m where m.title = :title group by m.year / 10 * 10 order by m.year / 10 * 10",
Integer.class)
.setParameter("title", "Hairspray")
.getResultList();
for (var decade : groupExpressionResult) {
System.out.println("Decade: " + decade);
}

하이버네이트 ORM 확장은 이 쿼리 $sort 및 $project 단계가 표현식 다시 계산하는 대신 _id.k0 에서 그룹화 키를 읽는 파이프라인 으로 변환합니다.

[
{ "$match": { "title": { "$eq": "Hairspray" } } },
{
"$group": {
"_id": {
"k0": {
"$multiply": [
{ "$toInt": { "$divide": [ "$year", 10 ] } },
10
]
}
}
}
},
{ "$sort": { "_id.k0": 1 } },
{ "$project": { "#c_1": "$_id.k0", "_id": 0 } }
]

그룹화 키가 포함된 계산된 표현식 선택할 수도 있습니다. 이 경우, 하이버네이트 ORM 확장은 키로 그룹화하고 $project 단계의 키로부터 표현식 계산합니다.

계산된 표현식에 대해 자세히 학습 쿼리 지정 가이드 의 계산된 표현식 사용 섹션을 참조하세요.

결과에서 그룹을 제거 하려면 having 절을 사용합니다. 하이버네이트 ORM 확장은 having 절을 사용하여 그룹화 키를 필터하다 합니다. and 및 or 연산자를 사용하여 여러 조건을 결합할 수 있습니다.

이 예시 다음 작업을 수행합니다.

  • sample_mflix.movies 컬렉션 에서 "Hairspray" 영화를 검색합니다.

  • year 필드 기준으로 영화를 그룹화하며, 각 출시하다 연도에 대해 하나의 행을 반환합니다.

  • 2000보다 큰 year 값만 포함하도록 그룹을 필터링합니다.

  • 결과를 연도별로 오름차순으로 정렬합니다.

var havingResult = session.createQuery(
"select year from Movie where title = :title group by year having year > 2000 order by year",
Integer.class)
.setParameter("title", "Hairspray")
.getResultList();
for (var year : havingResult) {
System.out.println("Year: " + year);
}
var havingResult = entityManager.createQuery(
"select m.year from Movie m where m.title = :title group by m.year having m.year > 2000 order by m.year",
Integer.class)
.setParameter("title", "Hairspray")
.getResultList();
for (var year : havingResult) {
System.out.println("Year: " + year);
}

하이버네이트 ORM 확장은 이 쿼리 다음 파이프라인 으로 변환합니다. where 절은 그룹화하기 전에 실행되는 $match 단계가 됩니다. having 절은 그룹화 후 실행되고 그룹화 키를 필터링하는 두 번째 $match 단계가 됩니다.

[
{ "$match": { "title": { "$eq": "Hairspray" } } },
{ "$group": { "_id": { "year": "$year" } } },
{ "$match": { "_id.year": { "$gt": 2000 } } },
{ "$sort": { "_id.year": 1 } },
{ "$project": { "_id#year": "$_id.year", "_id": 0 } }
]

MongoDB 데이터에서 다른 작업을 수행하는 방법에 대해 자세히 학습 CRUD 작업 수행 가이드 참조하세요.

HQL 및 JPQL을 사용하여 쿼리를 실행 방법에 대해 자세히 학습하려면 하이버네이트 ORM 문서에서 하이버네이트 쿼리 언어 가이드 를 참조하세요.