Docs Menu
Docs Home
/
Atlas
/ / / /

near (MongoDB Search 연산자)

MongoDB Search 인덱스 있더라도 near 연산자 사용하여 배열 에 저장된 숫자 또는 날짜 값을 쿼리 할 수 없습니다. 범위 배열 내의 인덱싱된 숫자 또는 날짜 값을 쿼리 데만 사용할 수 있습니다.

near

near 연산자는 숫자, 날짜 및 GeoJSON 포인트 값을 쿼리하고 점수를 매기는 기능을 지원합니다. 이 연산자를 사용하여 검색을 수행할 수 있습니다:

  • BSON int32, int64double 데이터 유형의 숫자 필드.

  • ISODate 형식인 BSON date 유형의 날짜 필드입니다.

  • 위도 및 경도 좌표를 사용하여 정의된 지리적 위치 필드입니다.

near 연산자 사용하여 숫자나 날짜에 가까운 결과를 찾을 수 있습니다. near 연산자 숫자 또는 날짜에 대한 근접성을 기준으로 MongoDB 검색 결과에 점수를 매깁니다.

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

{
$search: {
"index": <index name>, // optional, defaults to "default"
"near": {
"path": "<field-to-search>",
"origin": <date-or-number>,
"pivot": <pivot-distance>,
"score": <score-options>
}
}
}

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

필드
유형
설명
필요성

origin

날짜, 번호, 또는 지역

근처에서 검색할 번호, 날짜 또는 지리적 입니다. 결과의 근접성이 측정되는 원점입니다.

  • 숫자 필드의 경우 값은 BSON int32, int64 또는 double 데이터 유형이어야 합니다.

  • 날짜 필드의 경우 값은 ISODate 형식의 날짜여야 합니다.

  • 지리적 필드의 경우. 값은 GeoJSON 점이어야 합니다.

path

문자열 또는 문자열 배열

인덱싱된 필드 또는 검색할 필드.

pivot

숫자

MongoDB Search 결과 문서의 점수를 계산하는 데 사용하는 값입니다. 점수는 다음 공식을 사용하여 계산됩니다.

pivot
score = ------------------
pivot + distance

여기서 distanceorigin은 인덱싱된 필드 값의 차이입니다.

인덱스 필드 값이 origin에서 pivot 단위 떨어져 있는 경우 결과는 1/2(또는 0.5)과 같은 점수를 갖습니다. pivot 값은 >) 0 이상이어야 합니다.

origin

  • 숫자인 경우, pivot은 정수 또는 부동 소수점 숫자로 지정할 수 있습니다.

  • 날짜, pivot은 밀리초 단위로 지정해야 하며 32 또는 64비트 정수로 지정할 수 있습니다. 예시:

    • 1분은 다음과 같습니다. 60,000 ms

    • 1시간은 다음과 같습니다. 3,600,000 ms

    • 1일은 다음과 같습니다. 86,400,000 ms

    • 1개월(또는 30일)은 다음과 같습니다. 2,592,000,000 ms

  • GeoJSON 점인 경우, pivot은 미터 단위로 측정되며 정수 또는 부동 소수점 숫자로 지정되어야 합니다.

score

객체

일치하는 검색어 결과에 할당할 점수입니다. 다음 옵션을 사용하여 기본 점수를 수정할 수 있습니다.

  • boost결과 점수에 주어진 숫자를 곱합니다.

  • constant결과 점수를 주어진 숫자로 바꿉니다.

  • function결과 점수를 주어진 표현식으로 대체합니다.

쿼리에서 score 사용에 대한 자세한 내용은 결과에서 문서 채점하기를 참조하십시오.

자세한 학습 은 채점 동작을 참조하세요.

no

MongoDB Search score 은(는) MongoDB Search 결과가 origin에 얼마나 근접한지를 측정한 값입니다. score0 에서 1 사이로 조정되며, 1 는 정확히 일치하는 일치 항목이고 0 는 원거리 일치 항목입니다. origin 에서의 MongoDB Search 결과의 거리가 pivot를 사용하여 계산한 원점으로부터의 거리와 같을 때 점수는 0.5 입니다.

점수 계산에는 다음 공식이 사용됩니다.

pivot
score = ------------------
pivot + distance

여기서 distanceorigin은 인덱스 필드 값의 차이입니다.

쿼리에서 score 옵션을 사용하여 기본 점수를 수정할 수 있습니다. 옵션에 대해 자세히 알아보려면 점수 수정을 참조하세요.

숫자날짜 예제에서는 sample_mflix 데이터베이스의 movies 컬렉션을 사용합니다. GeoJSON 포인트 예제에서는 sample_airbnb 데이터베이스의 listingsAndReviews 컬렉션을 사용합니다.

클러스터에 샘플 데이터를 로드하는 경우 아래 예제의 인덱스 정의 또는 동적 인덱스 사용하여 정적 인덱스를 만들고 클러스터에서 예시 쿼리를 실행 수 있습니다.

샘플 데이터 세트를 이미 로드한 경우,MongoDB Search 빠른 시작 튜토리얼을 참조하여 인덱스 정의를 생성하고 MongoDB Search 쿼리를 실행 .

다음 예에서는 near 연산자를 사용하여 숫자 필드를 쿼리합니다. 다음 쿼리들은 movies 컬렉션의 모든 필드를 동적으로 인덱싱하는 runtimes이라는 인덱스를 사용합니다. 이 쿼리는 movies 컬렉션에서 runtime 필드 값이 279에 가까운 문서를 검색합니다.

다음 쿼리 검색 기준과 일치하는 모든 문서를 반환합니다. 여기에는 출력을 7 개의 결과로 제한하는 $limit 단계와 $project 단계가 포함되어 있습니다.

  • titleruntime을 제외한 모든 필드를 제외합니다.

  • 다음과 같은 이름의 필드를 추가합니다. score

scorepivot를 사용하여 계산됩니다.

1db.movies.aggregate([
2 {
3 $search: {
4 "index": "runtimes",
5 "near": {
6 "path": "year",
7 "origin": 2000,
8 "pivot": 2
9 }
10 }
11 },
12 {
13 $limit: 7
14 },
15 {
16 $project: {
17 "_id": 0,
18 "title": 1,
19 "runtime": 1,
20 score: { $meta: "searchScore" }
21 }
22 }
23])
[
{ runtime: 279, title: 'The Kingdom', score: 1 },
{ runtime: 279, title: 'The Kingdom', score: 1 },
{ runtime: 279, title: 'The Jinx: The Life and Deaths of Robert Durst', score: 1 },
{ runtime: 281, title: 'Les Misèrables', score: 0.5 },
{ runtime: 277, title: 'Tokyo Trial', score: 0.5 },
{ runtime: 283, title: 'Scenes from a Marriage', score: 0.3333333432674408 },
{ runtime: 274, title: 'The Crimson Petal and the White', score: 0.2857142984867096 }
]

MongoDB Search 결과에서 영화 The KingdomThe Jinx: The Life and Deaths of Robert Durstruntime 필드 값 279 가 정확히 일치하기 때문에 1.0 점을 받습니다. 영화 Les MisèrablesTokyo Trialruntime 필드 값이 279에서 2 단위 떨어져 있기 때문에 0.5 점을 받습니다.

다음 쿼리는 검색 기준에 대한 메타데이터 결과를 반환합니다. 즉, $searchMeta 단계를 사용하여 검색 기준과 일치하는 다음 버킷(연도)의 영화 수를 가져옵니다.

  • 2000, 이 버킷에 대한 포괄적인 하한값

  • 2005, 2000 버킷의 상한 제외 및 이 버킷의 하한 포함

  • 2010, 2005 버킷의 상한 제외 및 이 버킷의 하한 포함

  • 2010, 2010 버킷의 배타적 상한선

1db.movies.aggregate([
2 {
3 "$searchMeta": {
4 "facet": {
5 "operator": {
6 "near": {
7 "path": "runtime",
8 "origin": 279,
9 "pivot": 2
10 }
11 },
12 "facets": {
13 "yearFacet": {
14 "type": "number",
15 "path": "year",
16 "boundaries": [2000, 2005, 2010, 2015 ]
17 }
18 }
19 }
20 }
21 }
22])
[
{
count: { lowerBound: Long('20910') },
facet: {
yearFacet: {
buckets: [
{ _id: 2000, count: Long('3058') },
{ _id: 2005, count: Long('4012') },
{ _id: 2010, count: Long('4669') }
]
}
}
}
]

다음 예에서는 near 연산자를 사용하여 날짜 필드를 쿼리합니다.

예시

releaseddate라고 명명된 다음 인덱스 정의는 movies 컬렉션에서만 released 필드의 인덱스를 생성합니다.

1{
2 "mappings": {
3 "dynamic": false,
4 "fields": {
5 "released": {
6 "type": "date"
7 }
8 }
9 }
10}

다음 쿼리는 13, 1 9월 근처에 개봉된 영화를 검색합니다. 여기에는 출력 결과를 3 개로 제한하는 $limit 단계와 $project 단계가 포함되어 있습니다.

  • titlereleased을 제외한 모든 필드를 제외합니다.

  • 다음과 같은 이름의 필드를 추가합니다. score

결과의 scorepivot을 사용하여 계산됩니다.

참고

pivot 여기서는 밀리초 단위로 측정되며, 7,776,000,000 ms는 약 3개월에 해당합니다.

1db.movies.aggregate([
2 {
3 $search: {
4 "index": "releaseddate",
5 "near": {
6 "path": "released",
7 "origin": ISODate("1915-09-13T00:00:00.000+00:00"),
8 "pivot": 7776000000
9 }
10 }
11 },
12 {
13 $limit: 3
14 },
15 {
16 $project: {
17 "_id": 0,
18 "title": 1,
19 "released": 1,
20 score: { $meta: "searchScore" }
21 }
22 }
23])

위의 쿼리는 다음과 같은 검색 결과를 반환합니다.

{ "title" : "Regeneration", "released" : ISODate("1915-09-13T00:00:00Z"), "score" : 1 }
{ "title" : "The Cheat", "released" : ISODate("1915-12-13T00:00:00Z"), "score" : 0.49723756313323975 }
{ "title" : "Hell's Hinges", "released" : ISODate("1916-03-05T00:00:00Z"), "score" : 0.34090909361839294 }

위의 MongoDB Search 결과에서 1915-09-13released 필드 값이 정확히 일치하기 때문에 영화 Regeneration1 점을 받습니다. 1915-12-13에 개봉된 영화 The Cheatorigin 로부터의 released 필드 값 거리가 1915-09-13로부터 약 7,776,000,000 밀리초이기 때문에 약 0.5 점을 받습니다.

다음 예에서는 near 연산자를 사용하여 sample_airbnb.listingsAndReviews 컬렉션의 GeoJSON 점 객체를 쿼리합니다. 다음 인덱스 정의는 listingsAndReviews 컬렉션의 address.locationproperty_type 필드를 인덱싱합니다.

예시

1{
2 "mappings": {
3 "fields": {
4 "address": {
5 "fields": {
6 "location": {
7 "type": "geo"
8 }
9 },
10 "type": "document"
11 },
12 "property_type": {
13 "type": "string"
14 }
15 }
16 }
17}

다음 예에서는 near 연산자를 사용하여 sample_airbnb.listingsAndReviews 컬렉션의 address.location 필드를 쿼리합니다.

예시

다음 쿼리는 포르투갈의 숙소를 검색합니다. 여기에는 출력 결과를 3개로 제한하는 $limit 단계와 다음과 같은 $project 단계가 포함되어 있습니다.

  • nameaddress을 제외한 모든 필드를 제외합니다.

  • 다음과 같은 이름의 필드를 추가합니다. score

결과의 scorepivot을 사용하여 계산됩니다. 여기서 pivot은 미터 단위로 측정되며 1000미터는 1킬로미터에 해당합니다.

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "near": {
5 "origin": {
6 "type": "Point",
7 "coordinates": [-8.61308, 41.1413]
8 },
9 "pivot": 1000,
10 "path": "address.location"
11 }
12 }
13 },
14 {
15 $limit: 3
16 },
17 {
18 $project: {
19 "_id": 0,
20 "name": 1,
21 "address": 1,
22 score: { $meta: "searchScore" }
23 }
24 }
25])

위의 쿼리는 다음과 같은 검색 결과를 반환합니다.

1{
2 "name" : "Ribeira Charming Duplex",
3 "address" : {
4 "street" : "Porto, Porto, Portugal",
5 "suburb" : "",
6 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória",
7 "market" : "Porto",
8 "country" : "Portugal",
9 "country_code" : "PT",
10 "location" : {
11 "type" : "Point",
12 "coordinates" : [ -8.61308, 41.1413 ],
13 "is_location_exact" : false
14 }
15 },
16 "score" : 1
17}
18{
19 "name" : "DB RIBEIRA - Grey Apartment",
20 "address" : {
21 "street" : "Porto, Porto, Portugal",
22 "suburb" : "",
23 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória",
24 "market" : "Porto",
25 "country" : "Portugal",
26 "country_code" : "PT",
27 "location" : {
28 "type" : "Point",
29 "coordinates" : [ -8.61294, 41.14126 ],
30 "is_location_exact" : true
31 }
32 },
33 "score" : 0.9876177310943604
34}
35{
36 "name" : "Ribeira 24 (4)",
37 "address" : {
38 "street" : "Porto, Porto, Portugal",
39 "suburb" : "",
40 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória",
41 "market" : "Porto",
42 "country" : "Portugal",
43 "country_code" : "PT",
44 "location" : {
45 "type" : "Point",
46 "coordinates" : [ -8.61318, 41.14107 ],
47 "is_location_exact" : false
48 }
49 },
50 "score" : 0.973789632320404
51}

결과는 지정된 좌표에서 더 멀리 있는 속성의 점수가 낮다는 것을 보여줍니다.

다음 예에서는 compound 연산자를 사용하여 sample_airbnb.listingsAndReviews 컬렉션의 property_typeaddress.location 필드를 쿼리합니다.

예시

다음 쿼리는 지정된 GeoJSON 점 근처에 있는 홍콩의 아파트를 검색합니다. 쿼리는 반드시 충족되어야 하는 Atlas Search 조건을 지정하기 위해 must를 사용하고, 위치에 대한 기본 설정을 지정하기 위해 should 를 사용합니다. 여기에는 출력 결과를 3 개로 제한하는 $limit 단계와 $project 단계가 포함되어 있습니다.

  • property_typeaddress을 제외한 모든 필드를 제외합니다.

  • 다음과 같은 이름의 필드를 추가합니다. score

scorepivot을 사용하여 계산됩니다. 여기서 pivot은 미터 단위로 측정되며 1000미터는 1킬로미터에 해당합니다.

1db.listingsAndReviews.aggregate([
2 {
3 $search: {
4 "compound": {
5 "must": {
6 "text": {
7 "query": "Apartment",
8 "path": "property_type"
9 }
10 },
11 "should": {
12 "near": {
13 "origin": {
14 "type": "Point",
15 "coordinates": [114.15027, 22.28158]
16 },
17 "pivot": 1000,
18 "path": "address.location"
19 }
20 }
21 }
22 }
23 },
24 {
25 $limit: 3
26 },
27 {
28 $project: {
29 "_id": 0,
30 "property_type": 1,
31 "address": 1,
32 score: { $meta: "searchScore" }
33 }
34 }
35])

위의 쿼리는 다음과 같은 검색 결과를 반환합니다.

1{
2 "property_type" : "Apartment",
3 "address" : {
4 "street" : "Hong Kong, Hong Kong Island, Hong Kong",
5 "suburb" : "Central & Western District",
6 "government_area" : "Central & Western",
7 "market" : "Hong Kong",
8 "country" : "Hong Kong",
9 "country_code" : "HK",
10 "location" : {
11 "type" : "Point",
12 "coordinates" : [ 114.15027, 22.28158 ],
13 "is_location_exact" : true
14 }
15 },
16 "score" : 1.177286982536316
17}
18{
19 "property_type" : "Apartment",
20 "address" : {
21 "street" : "Hong Kong, Hong Kong Island, Hong Kong",
22 "suburb" : "Central & Western District",
23 "government_area" : "Central & Western",
24 "market" : "Hong Kong",
25 "country" : "Hong Kong",
26 "country_code" : "HK",
27 "location" : {
28 "type" : "Point",
29 "coordinates" : [ 114.15082, 22.28161 ],
30 "is_location_exact" : true
31 }
32 },
33 "score" : 1.1236450672149658
34}
35{
36 "property_type" : "Apartment",
37 "address" : {
38 "street" : "Hong Kong,
39 Hong Kong Island, Hong Kong",
40 "suburb" : "Mid-Levels",
41 "government_area" : "Central & Western",
42 "market" : "Hong Kong",
43 "country" : "Hong Kong",
44 "country_code" : "HK",
45 "location" : {
46 "type" : "Point",
47 "coordinates" : [ 114.15007, 22.28215 ],
48 "is_location_exact" : true
49 }
50 },
51 "score" : 1.114811897277832
52}

돌아가기

유사한 콘텐츠 더 보기

이 페이지의 내용