집계 빌더
이 페이지의 내용
개요
이 가이드 에서는 MongoDB Java 운전자 에서 집계 파이프라인 단계 를 빌드 하는 정적 팩토리 메서드를 제공하는 애그리게이션 클래스를 사용하는 방법을 학습 수 있습니다.
집계 에 학습 보려면 애그리게이션 가이드 를 참조하세요. 검색 가능하고 안전한 형식의 Java 메서드를 사용하여 애그리게이션에서 사용할 표현식 작업을 생성하는 방법을 학습 보려면 애그리게이션 표현식 작업을 참조하세요.
팁
다음 클래스의 메서드를 정적으로 가져오도록 선택하여 쿼리를 보다 간결하게 만들 수 있습니다.
Aggregates
Filters
Projections
Sorts
Accumulators
import static com.mongodb.client.model.Aggregates.*; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Projections.*; import static com.mongodb.client.model.Sorts.*; import static com.mongodb.client.model.Accumulators.*; import static com.mongodb.client.model.search.SearchPath.fieldPath; import static com.mongodb.client.model.search.VectorSearchOptions.exactVectorSearchOptions; import static java.util.Arrays.asList;
이 페이지의 예에서는 asList()
메서드를 정적으로 가져오는 것 외에도 이러한 정적 가져오기 상황을 가정합니다.
다음 메서드를 사용하여 파이프라인 단계를 구성하고 이를 집계에 목록으로 지정합니다.
Bson matchStage = match(eq("some_field", "some_criteria")); Bson sortByCountStage = sortByCount("some_field"); collection.aggregate(asList(matchStage, sortByCountStage)).forEach(doc -> System.out.println(doc));
match
match()
메서드를 사용하여 수신 문서를 지정된 쿼리 필터와 일치시켜 일치하지 않는 문서를 필터링하는 $match 파이프라인 단계를 만듭니다.
팁
이 필터는 Bson
을 구현하는 모든 클래스에 사용할 수 있지만 Filters 클래스와 함께 사용하면 편리합니다.
다음 예에서는 title
필드가 'The Shawshank Redemption'과 동일한 모든 문서와 일치하는 파이프라인 단계를 만듭니다.
match(eq("title", "The Shawshank Redemption"));
프로젝트
project()
메서드를 사용하여 지정된 문서 필드를 프로젝션하는 $project 파이프라인 단계를 만듭니다. 애그리게이션에서의 필드 프로젝션은 쿼리에서의 필드 프로젝션과 동일한 규칙을 따릅니다.
팁
이 프로젝션은 Bson
을 구현하는 모든 클래스에 사용할 수 있지만 Projections와 함께 사용하면 편리합니다.
다음 예에서는 _id
필드를 제외하고 title
및 plot
필드를 포함하는 파이프라인 단계를 만듭니다.
project(fields(include("title", "plot"), excludeId()));
계산된 필드 프로젝션
$project
단계는 계산된 필드도 프로젝션할 수 있습니다.
다음 예에서는 rated
필드를 rating
이라는 새 필드에 프로젝션하여 필드 이름을 효과적으로 변경하는 파이프라인 단계를 만듭니다.
project(fields(computed("rating", "$rated"), excludeId()));
문서
documents()
메서드를 사용하여 입력 값에서 리터럴 문서를 반환하는 $documents 파이프라인 단계를 만듭니다.
중요
집계 파이프라인에서 $documents
단계를 사용하는 경우 해당 단계가 파이프라인의 첫 번째 단계여야 합니다.
다음 예에서는 title
필드가 있는 샘플 문서를 생성하는 파이프라인 단계를 만듭니다.
documents(asList( new Document("title", "The Shawshank Redemption"), new Document("title", "Back to the Future"), new Document("title", "Jurassic Park")));
중요
documents()
메서드를 사용하여 집계 파이프라인에 입력을 제공하는 경우 컬렉션이 아니라 데이터베이스에서 aggregate()
메서드를 호출해야 합니다.
Sample
sample()
메서드를 사용하여 입력에서 문서를 무작위로 선택하는 $sample 파이프라인 단계를 만듭니다.
다음 예에서는 무작위로 5개 문서를 선택하는 파이프라인 단계를 만듭니다.
sample(5);
Sort
sort()
메서드를 사용하여 지정된 기준에 따라 정렬하는 $sort 파이프라인 단계를 만듭니다.
팁
이 정렬 기준은 Bson
을 구현하는 모든 클래스에 사용할 수 있지만 Sorts와 함께 사용하면 편리합니다.
다음 예에서는 year
필드 값에 따라 내림차순으로 정렬한 다음 title
필드 값에 따라 오름차순으로 정렬하는 파이프라인 단계를 만듭니다.
sort(orderBy(descending("year"), ascending("title")));
Skip
skip()
메서드를 사용하여 문서를 다음 단계로 전달하기 전에 지정된 수의 문서를 건너뛰는 $skip 파이프라인 단계를 만듭니다.
다음 예에서는 처음 5
개 문서를 건너뛰는 파이프라인 단계를 만듭니다.
skip(5);
Limit
$limit 파이프라인 단계를 사용하여 다음 단계로 전달되는 문서 수를 제한합니다.
다음 예에서는 문서 수를 10
개로 제한하는 파이프라인 단계를 만듭니다.
limit(10);
Lookup
lookup()
메서드를 사용하여 두 컬렉션 간에 조인 및 상관관계가 없는 하위 쿼리를 수행하는 $lookup 파이프라인 단계를 만듭니다.
왼쪽 외부 조인
다음 예에서는 movies
컬렉션과 comments
컬렉션 간의 왼쪽 외부 조인을 수행하는 파이프라인 단계를 만듭니다.
movies
의_id
필드를comments
의movie_id
필드에 조인합니다.그러면 결과가
joined_comments
필드에 출력됩니다.
lookup("comments", "_id", "movie_id", "joined_comments");
전체 조인 및 상관관계가 없는 하위 쿼리
다음 예에서는 품목 및 사용 가능한 수량이 주문 수량을 처리하기에 충분한지 여부에 따라 orders
및 warehouses
라는 두 컬렉션을 연결하는 파이프라인 단계를 만듭니다.
List<Variable<String>> variables = asList(new Variable<>("order_item", "$item"), new Variable<>("order_qty", "$ordered")); List<Bson> pipeline = asList( match(expr(new Document("$and", asList(new Document("$eq", asList("$$order_item", "$stock_item")), new Document("$gte", asList("$instock", "$$order_qty")))))), project(fields(exclude("stock_item"), excludeId()))); Bson innerJoinLookup = lookup("warehouses", variables, pipeline, "stockdata");
Group
group()
메서드를 사용하여 지정된 표현식으로 문서를 그룹화하고 각 개별 그룹화에 대해 문서를 출력하는 $group 파이프라인 단계를 만듭니다.
팁
이 드라이버에는 지원되는 각 축적자에 대한 정적 팩토리 메서드가 있는 Accumulators 클래스가 포함되어 있습니다.
다음 예에서는 customerId
필드 값을 기준으로 문서를 그룹화하는 파이프라인 단계를 만듭니다. 각 그룹은 quantity
필드 값의 합계와 평균을 totalQuantity
및 averageQuantity
필드에 축적합니다.
group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity"));
축적자 연산자에 대한 자세한 내용은 MongoDB Server 매뉴얼의 축적자 섹션을 참조하세요.
Pick-N 축적자
pick-n 축적자는 특정 순서가 지정된 경우 상위 및 하위 요소를 반환하는 집계 축적 연산자입니다. 집계 축적 연산자를 만들려면 다음 빌더 중 하나를 사용합니다.
팁
MongoDB v5.2 이상을 실행할 때만 이러한 pick-n 축적자를 사용하여 집계 작업을 수행할 수 있습니다.
축적자에 대한 MongoDB Server 매뉴얼 섹션에서 축적자 연산자를 사용할 수 있는 집계 파이프라인 단계를 알아보세요 .
MinN
minN()
빌더는 그룹화의 가장 낮은 n
값을 포함하는 문서의 데이터를 반환하는 $minN 축적자를 만듭니다.
팁
$minN
축적자와 $bottomN
축적자는 유사한 작업을 수행할 수 있습니다. 각 축적자의 권장 사용법은 $minN 축적자와 $bottomN 축적자 비교를 참조하세요.
다음 예에서는 minN()
메서드를 사용하여 imdb.rating
값이 가장 낮은 3개 영화를 year
별로 그룹화하여 반환하는 방법을 보여 줍니다.
group( "$year", minN( "lowest_three_ratings", new BsonString("$imdb.rating"), 3 ));
자세한 내용은 minN() API 설명서를 참조하세요.
MaxN
maxN()
축적자는 n
값이 가장 높은 그룹이 포함된 문서의 데이터를 반환합니다.
다음 예에서는 maxN()
메서드를 사용하여 imdb.rating
값이 가장 높은 2개 영화를 year
별로 그룹화하여 반환하는 방법을 보여 줍니다.
group( "$year", maxN( "highest_two_ratings", new BsonString("$imdb.rating"), 2 ));
자세한 내용은 maxN() API 설명서를 참조하세요.
FirstN
firstN()
축적자는 지정된 정렬 순서에 따라 각 그룹의 처음 n
개 문서의 데이터를 반환합니다.
팁
$firstN
축적자와 $topN
축적자는 유사한 작업을 수행할 수 있습니다. 각 축적자의 권장 사용법은 $firstN 축적자와 $topN 축적자 비교를 참조하세요.
다음 예에서는 firstN()
메서드를 사용하여 단계에 들어온 순서에 따라 처음 4개 영화의 title
값을 year
별로 그룹화하여 반환하는 방법을 보여줍니다.
group( "$year", firstN( "first_four_movies", new BsonString("$title"), 4 ));
자세한 내용은 firstN() API 설명서를 참조하세요.
LastN
lastN()
축적자는 지정된 정렬 순서에 따라 각 그룹에 있는 마지막 n
개 문서의 데이터를 반환합니다.
다음 예에서는 lastN()
메서드를 사용하여 단계에 들어온 순서에 따라 마지막 3개 영화의 title
값을 year
별로 그룹화하여 표시하는 방법을 보여 줍니다.
group( "$year", lastN( "last_three_movies", new BsonString("$title"), 3 ));
자세한 내용은 lastN() API 설명서를 참조하세요.
Top
top()
축적자는 지정된 정렬 순서에 따라 그룹에 있는 첫 번째 문서의 데이터를 반환합니다.
다음 예에서는 top()
메서드를 사용하여 imdb.rating
을 기준으로 최고 평점 영화의 title
및 imdb.rating
값을 year
별로 그룹화하여 반환하는 방법을 보여 줍니다.
group( "$year", top( "top_rated_movie", descending("imdb.rating"), asList(new BsonString("$title"), new BsonString("$imdb.rating")) ));
자세한 내용은 top() API 설명서를 참조하세요.
TopN
topN()
축적자는 지정된 필드에 대해 n
값이 가장 높은 문서의 데이터를 반환합니다.
팁
$firstN
축적자와 $topN
축적자는 유사한 작업을 수행할 수 있습니다. 각 축적자의 권장 사용법은 $firstN 축적자와 $topN 축적자 비교를 참조하세요.
다음 예에서는 topN()
메서드를 사용하여 runtime
값을 기준으로 상영 시간이 가장 긴 영화 3개의 title
및 runtime
값을 year
별로 그룹화하여 반환하는 방법을 보여 줍니다.
group( "$year", topN( "longest_three_movies", descending("runtime"), asList(new BsonString("$title"), new BsonString("$runtime")), 3 ));
자세한 내용은 topN() API 설명서를 참조하세요.
Bottom
bottom()
축적자는 지정된 정렬 순서에 따라 그룹에 있는 마지막 문서의 데이터를 반환합니다.
다음 예에서는 bottom()
메서드를 사용하여 runtime
값을 기준으로 상영 시간이 가장 짧은 영화의 title
및 runtime
값을 year
별로 그룹화하여 반환하는 방법을 보여 줍니다.
group( "$year", bottom( "shortest_movies", descending("runtime"), asList(new BsonString("$title"), new BsonString("$runtime")) ));
자세한 내용은 bottom() API 설명서를 참조하세요.
BottomN
bottomN()
축적자는 지정된 필드에 대해 n
값이 가장 낮은 문서의 데이터를 반환합니다.
팁
$minN
축적자와 $bottomN
축적자는 유사한 작업을 수행할 수 있습니다. 각 축적자의 권장 사용법은 $minN 축적자와 $bottomN 축적자 비교를 참조하세요.
다음 예에서는 bottomN()
메서드를 사용하여 imdb.rating
값을 기준으로 최저 등급 영화 2개의 title
및 imdb.rating
값을 year
별로 그룹화하여 반환하는 방법을 보여 줍니다.
group( "$year", bottomN( "lowest_rated_two_movies", descending("imdb.rating"), asList(new BsonString("$title"), new BsonString("$imdb.rating")), 2 ));
자세한 내용은 bottomN() API 설명서를 참조하세요.
Unwind
unwind()
메서드를 사용하여 입력 문서에서 배열 필드를 분해하고 각 배열 요소에 대한 출력 문서를 생성하는 $unwind 파이프라인 단계를 만듭니다.
다음 예에서는 sizes
배열의 각 요소에 대한 문서를 만듭니다.
unwind("$sizes");
배열 필드에 값이 누락되어 있거나, null
값이 있거나, 배열이 비어 있는 문서를 보존하려면 다음을 수행합니다.
unwind("$sizes", new UnwindOptions().preserveNullAndEmptyArrays(true));
이 예에서는 배열 인덱스를 포함하기 위해 "position"
이라는 필드에 다음을 수행합니다.
unwind("$sizes", new UnwindOptions().includeArrayIndex("position"));
Out
out()
메서드를 사용하여 동일한 데이터베이스의 지정된 컬렉션에 모든 문서를 쓰는 $out 파이프라인 단계를 만듭니다.
중요
$out
단계는 모든 집계 파이프라인의 마지막 단계여야 합니다.
다음 예에서는 파이프라인의 결과를 authors
컬렉션에 씁니다.
out("authors");
Merge
merge()
메서드를 사용하여 모든 문서를 지정된 컬렉션에 병합하는 $merge 파이프라인 단계를 만듭니다.
중요
$merge
단계는 모든 집계 파이프라인의 마지막 단계여야 합니다.
다음 예에서는 기본 옵션을 사용하여 파이프라인을 authors
컬렉션에 병합합니다.
merge("authors");
다음 예에서는 date
및 customerId
둘 다 일치하는 경우 문서를 대체하고 그렇지 않으면 문서를 삽입하도록 지정하는 몇 가지 옵션을 사용하여 파이프라인을 reporting
데이터베이스의 customers
컬렉션에 병합합니다.
merge(new MongoNamespace("reporting", "customers"), new MergeOptions().uniqueIdentifier(asList("date", "customerId")) .whenMatched(MergeOptions.WhenMatched.REPLACE) .whenNotMatched(MergeOptions.WhenNotMatched.INSERT));
GraphLookup
graphLookup()
메서드를 사용하여 지정된 컬렉션에서 재귀 검색을 수행하여 한 문서의 지정된 필드를 다른 문서의 지정된 필드와 일치시키는 $graphLookup 파이프라인 단계를 만듭니다.
다음 예에서는 friends
필드의 값을 name
필드에 반복적으로 일치시켜 contacts
컬렉션의 사용자에 대한 소셜 네트워크 그래프를 계산합니다.
graphLookup("contacts", "$friends", "friends", "name", "socialNetwork");
원하는 경우 GraphLookupOptions
를 사용하여 반복 사용할 깊이와 깊이 필드의 이름을 지정할 수 있습니다. 이 예에서 $graphLookup
은 최대 두 번 반복되고 모든 문서에 대한 재귀 깊이 정보가 포함된 degrees
필드를 만듭니다.
graphLookup("contacts", "$friends", "friends", "name", "socialNetwork", new GraphLookupOptions().maxDepth(2).depthField("degrees"));
GraphLookupOptions
를 사용하면 MongoDB에서 검색에 문서가 포함되도록 문서를 일치시키는 필터를 지정할 수 있습니다. 이 예에서는 hobbies
필드에 '골프'가 포함된 링크만 포함됩니다.
graphLookup("contacts", "$friends", "friends", "name", "socialNetwork", new GraphLookupOptions().maxDepth(1).restrictSearchWithMatch(eq("hobbies", "golf")));
SortByCount
sortByCount()
메서드를 사용하여 지정된 표현식을 기준으로 문서를 그룹화한 다음 이러한 그룹을 내림차순으로 카운트별로 정렬하는 $sortByCount 파이프라인 단계를 만듭니다.
팁
$sortByCount
단계는 $sum
축적자가 포함되어 있고 그 다음 단계가 $sort
인 $group
단계와 동일합니다.
[ { "$group": { "_id": <expression to group on>, "count": { "$sum": 1 } } }, { "$sort": { "count": -1 } } ]
다음 예에서는 x
필드의 잘린 값을 기준으로 문서를 그룹화하고 각 고유 값의 개수를 계산합니다.
sortByCount(new Document("$floor", "$x"));
ReplaceRoot
replaceRoot()
메서드를 사용하여 각 입력 문서를 지정된 문서로 대체하는 $replaceRoot 파이프라인 단계를 만듭니다.
다음 예에서는 각 입력 문서를 spanish_translation
필드의 중첩 문서로 바꿉니다.
replaceRoot("$spanish_translation");
AddFields
addFields()
메서드를 사용하여 문서에 새 필드를 추가하는 $addFields 파이프라인 단계를 만듭니다.
팁
필드 포함 또는 제외를 프로젝션하지 않으려면 $addFields
를 사용합니다.
다음 예에서는 입력 문서에 a
및 b
라는 두 개의 새 필드를 추가합니다.
addFields(new Field("a", 1), new Field("b", 2));
Count
count()
메서드를 사용하여 단계에 들어가는 문서 수를 계산하고 해당 값을 지정된 필드 이름에 할당하는 $count 파이프라인 단계를 만듭니다. 필드를 지정하지 않으면 count()
는 기본적으로 필드 이름을 "count"로 설정합니다.
팁
$count
단계는 다음에 대한 신택틱 슈거(Syntactic Sugar)입니다.
{ "$group":{ "_id": 0, "count": { "$sum" : 1 } } }
다음 예에서는 'total' 필드의 수신 문서 수를 출력하는 파이프라인 단계를 만듭니다.
count("total");
Bucket
bucket()
메서드를 사용하여 미리 정의된 경계 값을 중심으로 데이터 버킷을 자동화하는 $bucket 파이프라인 단계를 만듭니다.
다음 예에서는 screenSize
필드의 값을 기준으로 수신 문서를 그룹화하는 파이프라인 단계를 만듭니다. 여기에서 하한 경계 값과 상한 경계 값은 제외됩니다.
bucket("$screenSize", asList(0, 24, 32, 50, 70, 200));
BucketOptions
클래스를 사용하여 지정된 경계를 벗어난 값에 대한 기본 버킷을 지정하고 추가적인 축적자를 지정할 수 있습니다.
다음 예에서는 screenSize
필드 값을 기준으로 수신 문서를 그룹화하고, 각 버킷에 속하는 문서 수를 계산하여, screenSize
값을 matches
라는 필드에 넣고, 화면 크기가 '70' 보다 큰 경우 'monster'라는 버킷에 캡처하여 엄청나게 큰 화면 크기로 저장하는 파이프라인 단계를 만듭니다.
팁
이 드라이버에는 지원되는 각 축적자에 대한 정적 팩토리 메서드가 있는 Accumulators 클래스가 포함되어 있습니다.
bucket("$screenSize", asList(0, 24, 32, 50, 70), new BucketOptions().defaultBucket("monster").output(sum("count", 1), push("matches", "$screenSize")));
BucketAuto
bucketAuto()
메서드를 사용하여 지정된 수의 버킷에 문서를 균등하게 배포하려고 시도할 때 각 버킷의 경계를 자동으로 결정하는 $bucketAuto 파이프라인 단계를 만듭니다.
다음 예에서는 price
필드 값을 사용하여 문서를 생성하고 10개의 버킷에 균등하게 배포하려고 시도하는 파이프라인 단계를 만듭니다.
bucketAuto("$price", 10);
BucketAutoOptions
클래스를 사용하여 기본 숫자 기반의 체계를 지정하여 경계 값을 설정하고 추가적인 축적자를 지정합니다.
다음 예에서는 price
필드 값을 사용하여 문서를 10개 버킷에 생성하고 균등하게 배포하는 파이프라인 단계를 만들고, 버킷 경계를 2의 거듭제곱(2, 4, 8, 16, ...)으로 설정합니다. 또한 각 버킷의 문서 수를 계산하고 avgPrice
라는 새 필드에서 평균 price
를 계산합니다.
팁
이 드라이버에는 지원되는 각 축적자에 대한 정적 팩토리 메서드가 있는 Accumulators 클래스가 포함되어 있습니다.
bucketAuto("$price", 10, new BucketAutoOptions().granularity(BucketGranularity.POWERSOF2) .output(sum("count", 1), avg("avgPrice", "$price")));
패싯
facet()
메서드를 사용하여 병렬 파이프라인을 정의할 수 있는 $facet 파이프라인 단계를 만듭니다.
다음 예에서는 두 개의 병렬 집계를 실행하는 파이프라인 단계를 만듭니다.
첫 번째 집계는 수신 문서를
attributes.screen_size
필드에 따라 5개 그룹으로 배포합니다.두 번째 집계는 모든 manufacturers를 계산하고 상위 5개로 제한되는 개수를 반환합니다.
facet(new Facet("Screen Sizes", bucketAuto("$attributes.screen_size", 5, new BucketAutoOptions().output(sum("count", 1)))), new Facet("Manufacturer", sortByCount("$attributes.manufacturer"), limit(5)));
SetWindowFields
setWindowFields()
메서드를 사용하여 기간 연산자를 통해 컬렉션의 지정된 기간 범위의 문서에서 작업을 수행할 수 있는 $setWindowFields 파이프라인 단계를 만듭니다.
다음 예에서는 rainfall
및 temperature
필드에 표시된 보다 세분화된 측정값을 바탕으로 각 지역의 지난 달 누적 강우량과 평균 기온을 계산하는 파이프라인 단계를 만듭니다.
Window pastMonth = Windows.timeRange(-1, MongoTimeUnit.MONTH, Windows.Bound.CURRENT); setWindowFields("$localityId", Sorts.ascending("measurementDateTime"), WindowOutputFields.sum("monthlyRainfall", "$rainfall", pastMonth), WindowOutputFields.avg("monthlyAvgTemp", "$temperature", pastMonth));
Densify
densify()
메서드를 사용하여 지정된 간격에 걸쳐 일련의 문서 시퀀스를 생성하는 $densify 파이프라인 단계를 만듭니다.
팁
$densify()
집계 단계는 MongoDB v5.1 이상을 실행하는 경우에만 사용할 수 있습니다.
1시간 간격으로 유사한 position
필드에 대한 측정값이 포함된 Atlas 샘플 날씨 데이터 세트 에서 검색한 다음 문서를 가정해 보겠습니다.
Document{{ _id=5553a..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:00:00 EST 1984, ... }} Document{{ _id=5553b..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 09:00:00 EST 1984, ... }}
이러한 문서에서 아래의 조치를 수행하는 파이프라인 단계를 생성해야 한다고 가정해 보겠습니다.
ts
값이 아직 존재하지 않는 경우 15분 간격으로 문서를 추가합니다.position
필드를 기준으로 문서를 그룹화합니다.
이러한 조치를 수행하는 densify()
집계 단계 빌더에 대한 호출은 다음과 유사합니다.
densify( "ts", DensifyRange.partitionRangeWithStep(15, MongoTimeUnit.MINUTE), DensifyOptions.densifyOptions().partitionByFields("position.coordinates"));
다음 출력에는 기존 문서 간에 15분마다 ts
값을 포함하는 애그리게이션 단계에서 생성된 문서가 강조되어 있습니다.
Document{{ _id=5553a..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:00:00 EST 1984, ... }} Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:15:00 EST 1984 }} Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:30:00 EST 1984 }} Document{{ position=Document{{coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 08:45:00 EST 1984 }} Document{{ _id=5553b..., position=Document{{type=Point, coordinates=[-47.9, 47.6]}}, ts=Mon Mar 05 09:00:00 EST 1984, ... }}
자세한 내용은 densify 패키지 API 설명서를 참조하세요.
Fill
fill()
메서드를 사용하여 null
및 누락된 필드 값을 채우는 $fill 파이프라인 단계를 만듭니다.
팁
$fill()
집계 단계는 MongoDB v5.3 이상을 실행하는 경우에만 사용할 수 있습니다.
시간별 온도 및 기압 측정 값이 포함된 다음 문서를 고려합니다.
Document{{_id=6308a..., hour=1, temperature=23C, air_pressure=29.74}} Document{{_id=6308b..., hour=2, temperature=23.5C}} Document{{_id=6308c..., hour=3, temperature=null, air_pressure=29.76}}
다음과 같이 문서에서 누락된 온도 및 기압 데이터 포인트를 채워야 한다고 가정해 보겠습니다.
선형 보간법을 사용하여 '2' 시간에 대한
air_pressure
필드를 채워 값을 계산합니다.누락된
temperature
값을 '3' 시간에 대해 '23.6C'로 설정합니다.
이러한 조치를 수행하는 fill()
집계 단계 빌더에 대한 호출은 다음과 유사합니다.
fill( FillOptions.fillOptions().sortBy(ascending("hour")), FillOutputField.value("temperature", "23.6C"), FillOutputField.linear("air_pressure") );
다음 출력에는 애그리게이션 단계에서 채워진 필드가 포함된 문서가 강조되어 있습니다.
Document{{_id=6308a..., hour=1, temperature=23C, air_pressure=29.74}} Document{{_id=6308b..., hour=2, temperature=23.5C, air_pressure=29.75}} Document{{_id=6308c..., hour=3, temperature=23.6C, air_pressure=29.76}}
자세한 내용은 fill 패키지 API 설명서를 참조하세요.
Atlas 전체 텍스트 검색
search()
메서드를 사용하여 하나 이상의 필드에 대한 전체 텍스트 검색을 지정하는 $search 파이프라인 단계를 만듭니다.
팁
MongoDB Atlas v4.2 이상에서만 사용 가능
이 집계 파이프라인 연산자는4.2 Atlas Search 인덱스 가 적용되는 v 이상을 실행하는 MongoDB Atlas 클러스터에 호스팅되는 컬렉션에만 사용할 수 있습니다. 이 연산자의 필수 설정 및 기능에 대한 자세한 내용은 Atlas Search 설명서를 참조하세요.
다음 예에서는 title
필드에서 'Future'라는 단어가 포함된 텍스트를 검색하는 파이프라인 단계를 만듭니다.
Bson textSearch = Aggregates.search( SearchOperator.text( SearchPath.fieldPath("title"), "Future"));
Atlas Search API 패키지 문서에서 빌더에 대해 자세히 알아보세요.
Atlas Search 메타데이터
searchMeta()
메서드를 사용하여 Atlas 전체 텍스트 검색 쿼리에서 결과의 메타데이터 부분만 반환하는 $searchMeta 파이프라인 단계를 만듭니다.
팁
MongoDB Atlas v4.4.11 이상에서만 사용 가능
이 집계 파이프라인 연산자는 v4.4.11 이상을 실행하는 MongoDB Atlas 클러스터에서만 사용할 수 있습니다. 사용 가능한 버전에 대한 자세한 목록은 $searchMeta에 대한 MongoDB Atlas 설명서를 참조하세요.
다음 예에서는 Atlas Search 집계 단계의 count
메타데이터를 보여 줍니다.
Aggregates.searchMeta( SearchOperator.near(2010, 1, SearchPath.fieldPath("year")));
searchMeta() API 문서에서이 헬퍼에 대해 자세히 알아보세요.
Atlas Vector Search
중요
이 기능을 지원하는 MongoDB Atlas 버전에 대한 자세한 내용은 MongoDB Atlas 설명서의 제한 사항을 참조하세요.
vectorSearch()
메서드를 사용하여 시맨틱 Atlas Search 를 지정하는 $vectorSearch 파이프라인 단계를 만듭니다. 시맨틱 Atlas Search는 의미가 유사한 정보를 찾는 Atlas Search의 한 유형입니다.
이 기능 을 사용하려면 벡터 검색 인덱스 를 설정하다 하고 벡터 임베딩을 인덱스 해야 합니다. 프로그래밍 방식으로 벡터 검색 인덱스 를 만드는 방법에 학습 보려면 인덱스 가이드 의 Atlas Search 및 Vector Search 인덱스 섹션을 참조하세요. 벡터 임베딩에 학습 보려면 벡터 검색을 위한 벡터 임베딩을 인덱스하는 방법을 참조하세요.
다음 예에서는 vectorSearch()
및 project()
메서드를 사용하여 벡터 검색 점수를 계산하는 집계 파이프라인을 구축하는 방법을 보여줍니다.
List<Double> queryVector = (asList(-0.0072121937, -0.030757688, -0.012945653)); String indexName = "mflix_movies_embedding_index"; FieldSearchPath fieldSearchPath = fieldPath("plot_embedding"); int limit = 1; VectorSearchOptions options = exactVectorSearchOptions().filter(gte("year", 2016)); List<Bson> pipeline = asList( vectorSearch( fieldSearchPath, queryVector, indexName, limit, options), project( metaVectorSearchScore("vectorSearchScore")));
다음 예에서는 앞에 설명한 집계 파이프라인의 결과에서 점수를 출력하는 방법을 보여줍니다.
Document found = collection.aggregate(pipeline).first(); double score = found.getDouble("vectorSearchScore").doubleValue(); System.out.println("vectorSearch score: " + score);
vectorSearch() 에서 이 도우미에 자세히 보기 . API 문서.