MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Docs Menu
Docs Home
/ /

네이티브 데이터베이스 쿼리 수행

이 가이드 에서는 최대 절전 모드 ORM용 MongoDB 확장을 사용하여 MongoDB database 에서 네이티브 쿼리를 실행 방법을 학습 수 있습니다. 하이버네이트 쿼리 언어(HQL) 또는 자카르타 지속성 쿼리 언어(JPQL) 대신 네이티브 쿼리를 사용하면 MongoDB 쿼리 언어(MQL)를 사용하여 쿼리 지정할 수 있습니다. MQL 은 MongoDB의 문서 기반 모델과 상호 작용하도록 설계된 쿼리 구문입니다.

MongoDB 쿼리 언어

MQL의 구문 및 기능에 대해 자세히 학습 보려면 MongoDB Server 매뉴얼의 MongoDB 쿼리 언어 참조 를 참조하세요.

최대 절전 모드 ORM의 createQuery() 메서드는 일부 MongoDB 쿼리 기능을 지원 하지 않습니다. createNativeQuery() 메서드를 사용하면 MQL 에서 데이터베이스 쿼리를 지정하고 하이버네이트 ORM 확장의 일부 운영 제한 사항을 우회할 수 있습니다.

확장된 쿼리 기능을 위해 MongoClient 객체 에서 직접 쿼리를 실행 수도 있습니다.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트sample_mflix.movies 컬렉션 나타내는 Movie 엔터티를 사용합니다. Movie 엔터티의 정의는 다음과 같습니다.

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private String plot;
private int year;
private int runtime;
private List<String> cast;
public Movie(String title, String plot, int year, int runtime, List<String> cast) {
this.title = title;
this.plot = plot;
this.year = year;
this.runtime = runtime;
this.cast = cast;
}
public Movie() {
}
public ObjectId getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlot() {
return plot;
}
public void setPlot(String plot) {
this.plot = plot;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getRuntime() {
return runtime;
}
public void setRuntime(int runtime) {
this.runtime = runtime;
}
public List<String> getCast() {
return cast;
}
public void setCast(List<String> cast) {
this.cast = cast;
}
}

최대 절전 모드용 MongoDB 확장 ORM을 사용하여 이 MongoDB 샘플 컬렉션과 상호 작용하는 Java 애플리케이션 만드는 방법을 학습하려면 시작하기 튜토리얼을 참조하세요.

참고

지속성 컨텍스트

하이버네이트 ORM이 데이터베이스 와 상호 작용 활성화 하려면 하이버네이트 Session 또는 자카르타 퍼시스턴스 EntityManager를 사용하여 퍼시스턴스 컨텍스트 내에서 작업을 실행 해야 합니다. 이 가이드 의 예제에서는 Session를 사용합니다. 지속성 컨텍스트에 대해 자세히 학습 트랜잭션 및 세션 가이드 참조하세요.

네이티브 MongoDB 쿼리 실행 하려면 집계 파이프라인 에서 컬렉션 할 쿼리 과 쿼리 기준을 포함하는 MQL ( MongoDB Query Language) 성명서 지정합니다.

집계 파이프라인

집계 파이프라인 구성 및 집계 작업 실행에 대한 자세한 학습은 MongoDB Server 매뉴얼의 집계 파이프라인 참조를 참조하세요.

MQL 성명서 형식은 다음과 같습니다.

String mqlSyntax = """
{
aggregate: "<collection to query>",
pipeline: [
<aggregation pipeline stages>
]
}
""";

중요

$ 프로젝트 단계 요구 사항

MQL 성명서 집계 파이프라인에는 $project 단계가 포함되어야 합니다. 쿼리 문서를 엔터티 인스턴스로 반환하려면 $project 단계에서 기본 키 필드 이외의 각 엔터티 필드 지정해야 합니다.

그런 다음 MQL 성명서 createNativeQuery() 메서드에 전달합니다. 매개변수 값을 사용하는 네이티브 쿼리는 실행 수 없습니다. 대신 MQL 성명서 내에 검색 텀을 지정합니다.

네이티브 쿼리를 사용하여 다음 작업을 수행할 수 있습니다.

이 예시 createNativeQuery() 메서드에 MQL 성명서 전달하여 sample_mflix.movies 컬렉션 에 대한 네이티브 쿼리 실행합니다. 이 코드는 다음 집계 파이프라인 단계 지정합니다.

  • $match: 제목 필드 값이 다음과 같은 문서를 필터링합니다. "The Parent Trap"

  • $sort: 일치하는 문서를 year 필드를 기준으로 내림차순으로 정렬합니다.

  • $project: Movie 엔터티에 정의된 각 문서 필드 반환합니다.

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{ $match: { title: { $eq: "The Parent Trap" } } },
{ $sort: { year: -1 } },
{ $project: { title: 1, plot: 1, year: 1, runtime: 1, cast: 1 } }
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie movie : results) {
System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear());
}
Title: The Parent Trap, Year: 1998
Title: The Parent Trap, Year: 1961

하이버네이트 ORM 확장은 현재 산술 연산자를 사용하는 HQL 또는 JPQL 문을 지원 하지 않습니다. 그러나 MQL 성명서 에서 MongoDB의 산술 연산자를 사용하여 데이터에 산술 연산을 수행할 수 있습니다.

다음 예시 sample_mflix.movies 컬렉션 에서 다음 조치를 수행하는 네이티브 쿼리 실행합니다.

  • year 값이 2000 보다 크고 runtime 필드 존재하는 문서와 일치하는 $match 단계를 지정합니다.

  • runtimeHours이라는 새 필드 추가하는 $addFields 단계를 지정합니다.

  • $divide 산술 연산자 사용하여 새 runtimeHours 필드 의 runtime 값을 분에서 시간으로 변환합니다.

  • 기본 키 필드 이외의 Movie 엔터티에 정의된 각 문서 필드 반환하는 $project 단계를 지정합니다.

  • 업데이트된 각 문서 의 title 값을 출력합니다.

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{ $match: { year: { $gt: 2000 }, runtime: { $exists: true } } },
{ $addFields: {
runtimeHours: { $divide: [ "$runtime", 60 ] }
}},
{ $project: {
title: 1,
plot: 1,
year: 1,
runtime: 1,
cast: 1,
runtimeHours: 1
}}
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie result : results) {
System.out.println("Added field to movie: " + result.getTitle());
}
Added field to movie: Kate & Leopold
Added field to movie: Crime and Punishment
Added field to movie: Glitter
Added field to movie: The Manson Family
Added field to movie: The Dancer Upstairs
Added field to movie: Fantastic Four
...

네이티브 쿼리를 실행 데이터베이스 에서 데이터에 대한 세분화된 텍스트 검색인 MongoDB Search 쿼리를 수행할 수 있습니다. 이러한 쿼리는 텍스트 구문 일치, 관련성에 대한 결과 채점, 일치 항목 강조 표시 등의 고급 검색 기능을 제공합니다.

중요

트랜잭션 내에서는 MongoDB Search 쿼리 실행 수 없습니다.

검색 쿼리 지정하려면 쿼리 하려는 필드를 포함하는 검색 인덱스 만듭니다. 그런 다음 $search 또는 $searchMeta 단계가 포함된 createNativeQuery() 메서드에 집계 파이프라인 전달합니다.

MongoDB Search

MongoDB Search 검색 쿼리 및 인덱스에 대해 자세히 학습하려면 MongoDB Server 매뉴얼의 MongoDB Search 개요 를 참조하세요.

이 예시 $search 파이프라인 단계를 createNativeQuery() 메서드에 전달하여 검색 쿼리 실행합니다. 이 코드는 다음 조치를 수행합니다.

  • plot 필드 포함하는 검색 인덱스 지정합니다. <indexName> 자리 표시자를 검색 인덱스 이름으로 바꿔야 합니다.

  • plot 값 사이에 3 단어 이하의 "whirlwind romance" 문자열이 포함된 문서를 쿼리합니다.

  • 기본 키 필드 이외의 Movie 엔터티에 정의된 각 문서 필드 반환하는 $project 단계를 지정합니다.

  • 일치하는 문서의 titleplot 값을 출력합니다.

String nativeQuery = """
{
aggregate: "movies",
pipeline: [
{
$search: {
index: "<indexName>",
phrase: {
path: "plot",
query: "whirlwind romance",
slop: 3
}
}
},
{
$project: {
title: 1,
plot: 1,
year: 1,
runtime: 1,
cast: 1
}
}
]
}
""";
var results = session.createNativeQuery(nativeQuery, Movie.class)
.getResultList();
for (Movie result : results) {
System.out.println("Title: " + result.getTitle() + ", Plot: " + result.getPlot());
}
Title: Tokyo Fiancèe, Plot: A young Japanophile Belgian woman in Tokyo falls into a whirlwind romance with a Francophile Japanese student.
Title: Designing Woman, Plot: A sportswriter and a fashion-designer marry after a whirlwind romance, and discover they have little in common.
Title: Vivacious Lady, Plot: On a quick trip to the city, young university professor Peter Morgan falls in love with nightclub performer Francey Brent and marries her after a whirlwind romance. But when he goes back ...
Title: Ek Hasina Thi, Plot: A woman falls for a charming and mysterious businessman. The whirlwind romance turns sour when she is framed for his underworld crimes. Now, finally out of prison she is ready for sweet revenge.
Title: Kick, Plot: An adrenaline junkie walks away from a whirlwind romance and embraces a new life as a thief, though he soon finds himself pursued by veteran police officer and engaged in a turf war with a local gangster.
Title: A Tale of Winter, Plot: Felicie and Charles have a serious if whirlwind holiday romance. Due to a mix-up on addresses they lose contact, and five years later at Christmas-time Felicie is living with her mother in ...

createQuery() 메서드와 createNativeQuery() 메서드가 모두 지원하지 않는 데이터베이스 작업을 실행 하려는 경우 Java 애플리케이션 에서 직접 MongoClient 객체 에 대해 작업할 수 있습니다. MongoClient으로 작업할 때 MongoDB Java Sync Driver의 기능에 액세스 할 수 있습니다.

기능 지원

MongoClient 객체 사용하여 액세스 해야 하는 지원되지 않는 MongoDB 기능에 대해 자세히 학습하려면 기능 호환성 페이지를 참조하세요.

Java 운전자 사용하여 MongoDB 와 상호 작용 하는 방법을 학습 MongoDB Java 드라이버 설명서를 참조하세요.

하이버네이트 ORM 확장을 사용하여 컬렉션 에 인덱스를 생성할 수는 없지만 MongoClient 를 인스턴스화하고 Java 드라이버의 createIndex() 메서드를 사용할 수 있습니다. 다음 코드는 sample_mflix.movies 컬렉션 에 title 필드 인덱스 생성합니다.

// Replace the <connection URI> placeholder with your MongoDB connection URI
String uri = "<connection URI>";
MongoClient mongoClient = MongoClients.create(uri);
MongoDatabase db = mongoClient.getDatabase("sample_mflix");
MongoCollection<Document> collection = db.getCollection("movies");
String indexResult = collection.createIndex(Indexes.ascending("title"));
System.out.println(String.format("Index created: %s", indexResult));
Index created: title_1

Java 운전자 사용하여 인덱스를 생성하는 방법에 대해 자세히 학습하려면 Java 운전자 설명서의 인덱스 가이드를 참조하세요.

이 가이드 에서 설명하는 쿼리 언어에 대해 자세히 학습 다음 리소스를 참조하세요.

돌아가기

쿼리 지정

이 페이지의 내용