개요
path
매개변수는 MongoDB Search 연산자 가 검색할 필드를 지정하는 데 사용됩니다. 여기에는 다음이 포함될 수 있습니다.
문자열
문자열 배열
멀티 분석기 사양
문자열과 다중 분석기 사양의 조합이 포함된 배열입니다.
참고
모든 연산자가 다양한 유형의 경로를 모두 사용할 수 있는 것은 아닙니다. 지원하는 경로 유형에 대한 자세한 내용은 각 개별 연산자에 대한 문서를 참조하세요.
사용법
인덱싱된 필드 하나만 검색하려면 path
매개변수에 따옴표가 붙은 문자열을 사용하세요. 다음 예시에서는 description
이라는 필드를 검색합니다.
"path": "description"
인덱싱된 필드를 여러 개 검색하려면 path
매개변수에 인용된 문자열 배열을 사용하세요. 지정된 필드 중 하나와 일치하는 문서가 결과 집합에 포함됩니다. 다음 예에서는 description
및 type
필드를 검색합니다.
"path": [ "description", "type" ]
참고
multi
경로 옵션은 문자열 유형의 필드에만 사용할 수 있습니다.
인덱스 정의에 여러 분석기가 있는 필드가 포함된 경우 사용할 분석기를 지정할 수 있습니다. path
매개변수는 다음 필드가 있는 객체를 취할 수 있습니다.
필드 | 설명 |
---|---|
| 검색할 필드의 이름입니다. |
| 인덱스 정의의 |
|
다음 인덱스 정의에서 names
및 notes
라는 이름의 필드는 표준 분석기를 사용합니다. comments
라는 이름의 필드는 기본 분석기로 standard
를 사용하며, lucene.whitespace 분석기를 사용하는 mySecondaryAnalyzer
라는 이름의 multi
도 지정합니다.
{ "mappings": { "dynamic": false, "fields": { "names": { "type": "string", "analyzer": "lucene.standard" }, "notes": { "type": "string", "analyzer": "lucene.standard" }, "comments": { "type": "string", "analyzer": "lucene.standard", "multi": { "mySecondaryAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } } } } } }
다음 path
예시에서는 인덱스 정의에서 mySecondaryAnalyzer
라는 multi
를 사용하여 comments
필드를 검색합니다.
"path": { "value": "comments", "multi": "mySecondaryAnalyzer" }
인덱싱된 필드와 여러 분석기가 있는 필드의 조합을 검색하려면 배열을 사용합니다. 다음 예시에서는 기본 분석기를 사용하여 names
, notes
필드를 검색하고, 인덱스 정의에서 mySecondaryAnalyzer
라는 multi
를 사용하여 comments
필드를 검색합니다.
"path": [ "names", "notes", { "value": "comments", "multi": "mySecondaryAnalyzer" } ]
다음 path
예시에서는 인덱스 정의에서 mySecondaryAnalyzer
라는 multi
를 사용하여 문자 n
뒤에 임의의 문자가 있는 모든 필드와 comments
필드를 검색합니다.
"path": [{ "wildcard": "n*" }, { "value": "comments", "multi": "mySecondaryAnalyzer" }]
예시
다음 예시에서는 다음 문서가 있는 cars
라는 collection을 사용합니다.
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." } { "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Black four-door SUV, three rows of seats." }
정적 필드 매핑을 사용하면 collection 내의 개별 필드를 인덱싱하고 검색하는 방법을 지정할 수 있습니다.
cars
collection에 대한 인덱스 정의는 다음과 같습니다.
{ "mappings": { "dynamic": false, "fields": { "make": { "type": "string", "analyzer": "lucene.standard" }, "description": { "type": "string", "analyzer": "lucene.standard", "multi": { "simpleAnalyzer": { "analyzer": "lucene.simple", "type": "string" } } } } } }
위의 인덱스 정의는 make
필드를 표준 분석기로 인덱싱하도록 지정합니다. description
필드는 기본적으로 standard
분석기를 사용하지만, multi
매개변수와 함께 simpleAnalyzer
를 지정하여 간단한 분석기를 사용할 수도 있습니다.
단일 필드 검색
다음은 make
필드에서 Ford
문자열을 검색하는 예시입니다.
db.cars.aggregate([ { $search: { "text": { "query": "Ford", "path": "make" } } } ])
위 예시에서는 _id: 3
이 포함된 문서가 반환됩니다.
다중 필드 검색
다음 예시에서는 path
매개변수의 필드 배열을 사용하여 make
또는 description
필드에서 blue
문자열을 검색합니다.
db.cars.aggregate([ { $search: { "text": { "query": "blue", "path": [ "make", "description" ] } } } ])
앞의 쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
대체 분석기 검색
단순 분석기 예시
다음 예시에서는 간단한 분석기를 사용하는 인덱스 정의에서 simpleAnalyzer
라는 이름의 multi
를 사용합니다.
쿼리는 description
필드에서 문자열 driver
을 검색합니다.
db.cars.aggregate([ { $search: { "text": { "query": "driver", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
앞의 쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." }
단순 분석는 driver's
side airbag
을 [driver s side airbag
]으로 인덱싱하므로 driver
에서 일치합니다.
반면, 기본 표준 분석기는 driver's side airbag
를 [driver's side airbag
]으로 인덱싱하므로 driver's
나 side
에서는 일치하지만 driver
에서는 일치하지 않습니다.
공백 분석기 예시
cars
컬렉션에 대한 인덱스 정의의 multi
객체가 다음과 같다고 가정합니다.
"multi": { "simpleAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } }
다음 예시에서는 공백 분석기를 사용하는 인덱스 정의에서 simpleAnalyzer
라는 이름의 multi
를 사용합니다.
db.cars.aggregate([ { $search: { "text": { "query": "Three", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
앞의 쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Three
텀 에 대한 위 쿼리 의 경우, MongoDB Search는 공백 분석기 대소문자를 구분하기 때문에 Three
텀 와 일치하는 문서만 반환하고 three
는 반환하지 않습니다. 반면 기본값 표준 분석기 대소문자를 구분하지 않으며 쿼리 의 텀 와 일치하는 모든 문서를 컬렉션 에 나열된 순서대로 반환합니다.
그러면 다음 쿼리를 살펴보겠습니다.
db.cars.aggregate([ { $search: { "compound": { "should": [ { "text": { "path": "description", "query": "Three" } }, { "text": { "query": "Three", "path": { "value" : "description", "multi" : "simpleAnalyzer" }, score: { boost: { value: 2 }} } } ] } } }, { $project: { "_id": 0, "type": 1, "description": 1, "score": { "$meta": "searchScore" } } } ])
앞의 쿼리는 다음과 같은 결과를 반환합니다.
{ "type" : "sedan", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers seats.", "score" : 1.1092689037322998 } { "type" : "SUV", "description" : "Black four-door SUV, three rows of seats.", "score" : 0.17812025547027588 }
위의 쿼리 에 대해 MongoDB Search는 Three
및 three
가 모두 포함된 문서를 반환합니다. 그러나 Three
의 결과 점수가 더 높은 이유는 three
의 문서 기본값 표준 분석기 사용하여 일치시킨 반면, Three
의 문서 지정된 simpleAnalyzer
와 기본값 표준 분석기모두에서 일치시켰기 때문입니다.
다음 예에서는 다음 문서와 함께 posts
라는 컬렉션을 사용합니다.
{ "_id": 1, "username": "pinto", "post": { "date": "12-03-2018", "forum": "Tofu Recipes", "body": "Spicy Garlic Tofu cooks up crispy in 10 minutes or less. Serve with broccoli and rice for a delicious vegetarian meal." } } { "_id": 2, "username": "paloma", "post": { "date": "12-08-2018", "forum": "Tofu Recipes", "body": "Crispy Tofu in Shiitake Broth has flavors of citrus and umami. Great as an appetizer or entree." } }
동적 필드 매핑을 사용하면 필요에 따라 컬렉션의 모든 필드를 인덱싱할 수 있습니다.
posts
collection에 대한 인덱스 정의는 다음과 같습니다.
{ "mappings": { "dynamic": true } }
중첩된 필드 검색
다음 복합 연산자 쿼리는 post.body
필드에서 broccoli
문자열을 검색하고 필드에 cauliflower
문자열이 포함되지 않도록 지정합니다.
db.posts.aggregate([ { $search: { "compound": { "must": { "text": { "query": "broccoli", "path": "post.body" } }, "mustNot": { "text": { "query": "cauliflower", "path": "post.body" } } } } } ])
앞의 쿼리는 _id: 1
이(가) 포함된 문서를 반환합니다. 여기서 posts.body
필드에는 문자열 broccoli
이(가) 포함되어 있습니다.
와일드카드 필드 검색
다음 예시에서는 다음 문서가 포함된 cars
라는 collection을 사용합니다.
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Two-door convertible, driver's-side airbag.", "warehouse" : [ { "inventory" : 5, "color" : "black" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }
cars
collection에 대한 인덱스 정의는 다음과 같습니다.
{ "mappings": { "dynamic": true } }
다음 쿼리는 red
문자열에 대해 와일드카드 문자 *
를 사용하여 지정된 필드를 검색합니다.
모든 필드 검색 예시
다음 쿼리는 모든 필드에서 문자열 red
를 검색합니다.
db.cars.aggregate([ { "$search": { "phrase": { "path": { "wildcard": "*" }, "query": "red" } } } ])
쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }
중첩된 필드 검색 예시
다음 쿼리는 warehouse
필드 내에 중첩된 필드에서 red
문자열을 검색합니다.
db.cars.aggregate([ { "$search": { "text": { "path": { "wildcard": "warehouse.*" }, "query": "red" } } } ])
쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }