Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

복합

이 페이지의 내용

  • 정의
  • 구문
  • 옵션
  • 사용법
  • 채점 동작
  • 예시
compound

compound 연산자는 두 개 이상의 연산자를 하나의 쿼리로 결합합니다. compound 쿼리의 각 요소를 절이라고 하며, 각 절은 하나 이상의 하위 쿼리로 구성됩니다. Atlas Search는 지침과 함께 샘플 복합 쿼리 템플릿을 제공합니다. 자세한 내용은 쿼리 지침 템플릿 보기를 참조하세요.

compound 의 구문은 다음과 같습니다:

1{
2 $search: {
3 "index": <index name>, // optional, defaults to "default"
4 "compound": {
5 <must | mustNot | should | filter>: [ { <clauses> } ],
6 "score": <options>
7 }
8 }
9}

must, mustNot, shouldfilter 절은 하위 절의 배열을 포함합니다. 배열에 하위 절이 하나만 포함되어 있어도 배열 구문을 사용합니다. 이 페이지의 예시를 참조하세요.

compound 는 다음 용어를 사용하여 쿼리를 구성합니다:

must

문서가 결과에 포함되기 위해 일치해야 하는 절입니다. 반환되는 점수는 해당 절에 있는 모든 하위 쿼리의 점수 합계입니다.

AND 부울 연산자에 매핑합니다.

mustNot

결과에 문서가 포함되려면 일치하지 않아야 하는 절입니다. mustNot 절은 반환된 문서의 점수에 영향을 주지 않습니다.

AND NOT 부울 연산자에 매핑합니다.

should

결과에 포함된 문서에서 일치시키려는 절입니다. should 절과 일치하는 항목이 포함된 문서는 should 절이 포함되지 않은 문서보다 점수가 더 높습니다. 반환되는 점수는 해당 절에 있는 모든 하위 쿼리의 점수 합계입니다.

should 절을 두 개 이상 사용하는 경우 minimumShouldMatch 옵션을 사용하여 결과에 문서를 포함하기 위해 일치해야 하는 최소 should 절의 수를 지정할 수 있습니다. 생략할 경우 minimumShouldMatch 옵션의 기본값은 0입니다.

예시를 참조하세요.

OR 부울 연산자에 매핑합니다.

복합 쿼리 내에서 should 절만 사용하는 경우 compound 연산자는 should 절 쿼리의 배열을 논리적인 OR 로 간주합니다. Atlas Search는 결과를 반환하려면 적어도 하나 이상의 should 기준과 일치하는 항목을 찾아야 합니다. minimumShouldMatch 옵션을 0으로 설정한 상태에서 여러 개의 should 절 기준을 지정하는 경우 Atlas Search는 minimumShouldMatch1로 설정한 것으로 간주하며 결과를 반환하려면 하나 이상의 기준이 일치해야 합니다.

filter

문서가 결과에 포함되기 위해 모두 일치해야 하는 절입니다. filter 절은 반환된 문서의 점수에 영향을 주지 않습니다.

예를 들어, compound 연산자 filter 옵션을 사용하여 $match 단계를 $search 단계로 바꿀 수 있습니다. 다음 $match 단계는 필드 role에 대해 지정된 값이 있는 문서를 필터링합니다.

$match: {
"role": { "$in": [ "CLIENT", "PROFESSIONAL" ] }
}

대신 compound 연산자 filter 옵션을 사용할 수 있습니다.

$search: {
"compound": {
"filter": [{
"queryString": {
"defaultPath": "role",
"query": "CLIENT OR PROFESSIONAL"
}
}]
}
}

다른 필터 예시를 참조하세요.

score
전체 compound 절의 점수를 수정합니다. score를 사용하여 점수를 높이거나, 바꾸거나, 다른 방식으로 변경할 수 있습니다. score를 지정하지 않는 경우 반환되는 점수는 일치 항목을 생성한 mustshould 절에 있는 모든 하위 쿼리의 점수 합계입니다. 자세히 알아보려면 채점 동작을 참조하세요.

자동 완성, 텍스트, 스팬 등의 최상위 연산자와 함께 절을 사용하여 쿼리 기준을 지정할 수 있습니다.

Atlas Search는 문서에서 일치하는 항목을 생성한 각 개별 조항에 대해 해당 문서가 받은 점수를 합산하여 결과 세트에서 문서에 점수를 매깁니다. mustshould 절만 채점에 참여합니다. 결과 세트은 최고 점수에서 최저 점수 순으로 정렬됩니다.

다음 표는 점수에 기여하거나 기여하지 않는 compound 절을 보여줍니다.

점수에 기여함
점수에 기여하지 않음
filter
must
mustNot
should

score 옵션을 사용해 전체 복합 쿼리의 점수를 높이거나 바꿀 수 있습니다. 전체 복합 점수를 바꾸는 예시는 아래의 복합 점수 예시를 참조하세요. 점수를 사용하여 각 절의 각 하위 쿼리에 대한 점수를 높이거나 변경할 수도 있습니다. 점수 수정에서 compound 연산자 절에서 변경된 점수의 예시를 확인할 수 있습니다.

Atlas Search Playground 또는 Atlas 클러스터에서 다음 예시를 사용해 볼 수 있습니다.

이 페이지의 예시에서는 fruit이라는 컬렉션을 사용하며, 이 컬렉션에는 다음 문서가 포함되어 있습니다:

1{
2 "_id" : 1,
3 "type" : "apple",
4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
5 "category" : "nonorganic",
6 "in_stock" : false
7},
8{
9 "_id" : 2,
10 "type" : "banana",
11 "description" : "Bananas are usually sold in bunches of five or six.",
12 "category" : "nonorganic",
13 "in_stock" : true
14},
15{
16 "_id" : 3,
17 "type" : "pear",
18 "description" : "Bosc and Bartlett are the most common varieties of pears.",
19 "category" : "organic",
20 "in_stock" : true
21}

fruit 컬렉션에는 컬렉션의 모든 필드를 자동으로 인덱싱하고 기본 표준 분석기를 사용하는 동적 매핑을 통한 기본 인덱스가 있습니다. standard 분석기는 모든 단어를 소문자로 처리하고 일반적인 중지 단어("the", "a", "and", 등)는 무시합니다.

다음 쿼리는 Atlas Search 쿼리의 $search compound 연산자를 보여줍니다.

다음 예에서는 must 절과 mustNot 절의 조합을 사용하여 쿼리를 구성합니다. must 절은 텍스트 연산자를 사용하여 description 필드에서 varieties 라는 용어를 검색합니다. 문서가 일치하려면 must 절을 충족해야 합니다. mustNot 절은 description 필드에서 apples 라는 용어에 대한 검색 작업을 수행합니다. 문서가 일치하려면 mustNot 절을 충족하면 됩니다.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "mustNot": [{
12 "text": {
13 "query": "apples",
14 "path": "description"
15 }
16 }]
17 }
18 }
19 }
20])

위의 쿼리는 description 필드에 varieties 라는 단어가 포함되어 있고 apples이 포함되어 있지 않기 때문에 _id: 3 가 포함된 문서를 반환합니다.

Atlas Search Playground에서 사용해 보세요

다음 쿼리는 must를 사용하여 충족해야 하는 검색 조건을 지정하고 should를 사용하여 Fuji 단어가 포함된 문서에 대한 기본 설정을 지정합니다.

이 쿼리의 경우 $project 파이프라인 단계에서는 _id 을(를) 제외한 모든 문서 필드를 제외하고 문서의 관련성 점수를 표시하는 score 필드를 추가합니다.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "Fuji",
14 "path": "description"
15 }
16 }]
17 }
18 }
19 },
20 {
21 "$project": {
22 "score": { "$meta": "searchScore" }
23 }
24 }
25])
{ "_id" : 1, "score" : 0.6425117254257202 }
{ "_id" : 3, "score" : 0.21649497747421265 }

_id: 1 이 있는 문서는 해당 문서의 description 필드에 should 절을 충족하는 단어 Fuji 포함되어 있기 때문에 점수가 더 높습니다.

Atlas Search Playground에서 사용해 보세요

다음 쿼리는 결과의 모든 문서에 대해 3constant 점수도 지정합니다. 이 쿼리의 경우 $project 파이프라인 단계에서는 _id을(를) 제외한 모든 문서 필드를 제외하고 문서의 관련성 점수를 표시하는 score 필드를 추가합니다.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "Fuji",
14 "path": "description"
15 }
16 }],
17 "score": { "constant": { "value": 3 } }
18 }
19 }
20 },
21 {
22 "$project": {
23 "score": { "$meta": "searchScore" }
24 }
25 }
26])
[ { _id: 1, score: 3 }, { _id: 3, score: 3 } ]

쿼리의 constant 옵션은 결과에 있는 각 문서의 점수를 숫자 3(으)로 대체하기 때문에 두 문서 모두 동일한 점수를 받습니다.

Atlas Search Playground에서 사용해 보세요

should 절이 여러 개 있는 쿼리에서 miniumumShouldMatch 옵션을 사용하여 결과를 반환하기 위해 일치해야 하는 최소 절 수를 지정할 수 있습니다.

다음 쿼리는 하나의 must 절과 두 개의 should 절이 있고 minimumShouldMatch 값은 1입니다. 문서는 description 필드에 varieties 라는 용어와 더불어 Fuji 또는 Golden Delicious 중 하나를 포함해야 결과 세트에 포함될 수 있습니다.

1db.fruit.aggregate([
2 {
3 $search: {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "Fuji",
14 "path": "description"
15 }
16 },
17 {
18 "text": {
19 "query": "Golden Delicious",
20 "path": "description"
21 }
22 }],
23 "minimumShouldMatch": 1
24 }
25 }
26 }
27])
1{
2 "_id" : 1,
3 "type" : "apple",
4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
5 "category" : "nonorganic",
6 "in_stock" : false
7}

_id: 1 이 있는 문서는 must 절과 두 개의 should 절 중 첫 번째 절과 일치합니다.

Atlas Search Playground에서 사용해 보세요

filter filter 절은 must동일하게 동작하지만,filter절이 반환된 문서의 점수에서 고려되지 않으므로 반환된 문서의 순서에 영향을 주지 않습니다.

다음 쿼리에서는 다음 절을 사용합니다.

  • mustfilter를 사용하여 충족해야 하는 검색 조건을 지정합니다.

  • shouldbanana라는 단어가 포함된 문서에 대한 선호도를 지정합니다. should 절에는 minimumShouldMatch 옵션이 포함되어 있지 않습니다. minimumShouldMatch 를 생략하면 기본값은 0이 됩니다.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "must": [{
6 "text": {
7 "query": "varieties",
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "banana",
14 "path": "description"
15 }
16 }],
17 "filter": [{
18 "text": {
19 "query": "granny",
20 "path": "description"
21 }
22 }]
23 }
24 }
25 }
26])
1{
2 "_id" : 1,
3 "type" : "apple",
4 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
5 "category" : "nonorganic",
6 "in_stock" : false
7}

반환된 문서는 포함을 위한 모든 요건을 충족합니다.

  • must 절과 filter 절이 모두 일치합니다.

  • minimumShouldMatch 0} 값이 지정되지 않았으므로 0 기본값은 입니다. 결과적으로 should 절이 실패하고 여전히 문서를 반환합니다.

Atlas Search Playground에서 사용해 보세요

Atlas 클러스터의 데이터에 대한 쿼리에서 $match$in으로 대체할 수 있으며 이는 filter 절을 사용하여 수행할 수 있습니다. 다음 쿼리는 $search 단계에서 일치해야 하는 검색어를 지정하기 위해 filter를 사용하는 방법을 보여줍니다. 또한 쿼리는 should를 사용하여 vvarieties라는 용어를 포함하는 문서에 대한 선호도를 지정합니다. 쿼리에는 다음 작업을 수행하기 위한 $project 파이프라인 단계도 포함됩니다.

  • _iddescription 이외의 모든 필드를 제외합니다.

  • 문서의 관련성 점수를 표시하는 score 필드를 추가합니다.

1db.fruit.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "filter": [{
6 "text": {
7 "query": ["apples", "bananas"],
8 "path": "description"
9 }
10 }],
11 "should": [{
12 "text": {
13 "query": "varieties",
14 "path": "description"
15 }
16 }]
17 }
18 }
19 },
20 {
21 "$project": {
22 "description": 1,
23 "score": { "$meta": "searchScore" }
24 }
25 }
26])
1[
2 {
3 _id: 1,
4 description: 'Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp. The most popular varieties are McIntosh, Gala, and Granny Smith.',
5 score: 0.36074575781822205
6 },
7 {
8 _id: 2,
9 description: 'Bananas are usually sold in bunches of five or six.',
10 score: 0
11 }
12]

결과의 문서는 포함을 위한 모든 요구 사항을 충족합니다.

  • 두 문서 모두 쿼리의 filter 절에 지정된 apples 또는 bananas 용어를 포함하고 있습니다.

  • _id: 1 문서는 쿼리의 should 절에 지정된 varieties 용어가 포함되어 있어 _id: 2 문서보다 점수가 높습니다.

Atlas Search Playground에서 사용해 보세요

다음 예시에서는 중첩된 compound 절을 사용하여 쿼리를 구성합니다. 이 예시의 경우 fruit 컬렉션에는 type, categoryin_stock 필드에 대한 인덱스가 있으며, 텍스트 필드는 기본 분석기를 사용합니다. 이 쿼리에서는 문서가 다음 should 절 중 하나만 충족해야 합니다.

  • type필드에 apple 이라는 단어를 입력합니다.

  • category 필드에 용어 organic을 포함하고 in_stock 필드에 true 값을 갖습니다.

1db.fruit.aggregate([
2 {
3 $search: {
4 "compound": {
5 "should": [
6 {
7 "text": {
8 "query": "apple",
9 "path": "type"
10 }
11 },
12 {
13 "compound": {
14 "must": [
15 {
16 "text": {
17 "query": "organic",
18 "path": "category"
19 }
20 },
21 {
22 "equals": {
23 "value": true,
24 "path": "in_stock"
25 }
26 }
27 ]
28 }
29 }
30 ],
31 "minimumShouldMatch": 1
32 }
33 }
34 }
35])
1{
2 "_id" : 3,
3 "type" : "pear",
4 "description" : "Bosc and Bartlett are the most common varieties of pears.",
5 "category" : "organic",
6 "in_stock" : true
7}
8{
9 "_id" : 1,
10 "type" : "apple",
11 "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp.",
12 "category" : "nonorganic",
13 "in_stock" : false
14}

결과의 문서는 포함을 위한 모든 요구 사항을 충족합니다.

  • _id: 3이 있는 문서가 두 번째 should 절 안에 중첩된 must 절과 일치합니다.

  • _id: 1 이 있는 문서가 첫 번째 should 절과 일치합니다.

Atlas Search Playground에서 사용해 보세요

돌아가기

자동 완성 기능