Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

가깝다

이 페이지의 내용

  • 정의
  • 구문
  • 옵션
  • 채점 동작
  • 제한 사항
  • 예시
near

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

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

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

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

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

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

숫자

Atlas 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

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

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

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

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

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

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

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

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

샘플 데이터 집합을 이미 로드한 경우, Atlas Search 시작하기 자습서에 따라 인덱스 정의를 만들고 Atlas Search 쿼리를 실행하세요.

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

예시

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

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

다음 쿼리는 movies 컬렉션에서 runtime 필드 값이 279 근처에 있는 문서를 검색합니다. 여기에는 출력 결과를 7 개로 제한하는 $limit 단계와 $project 단계가 포함되어 있습니다.

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

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

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

1db.movies.aggregate([
2 {
3 $search: {
4 "index": "runtimes",
5 "near": {
6 "path": "runtime",
7 "origin": 279,
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])

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

1{ "runtime" : 279, "title" : "The Kingdom", "score" : 1 }
2{ "runtime" : 279, "title" : "The Jinx: The Life and Deaths of Robert Durst", "score" : 1 }
3{ "runtime" : 280, "title" : "Shoah", "score" : 0.6666666865348816 }
4{ "runtime" : 281, "title" : "Les Misèrables", "score" : 0.5 }
5{ "runtime" : 277, "title" : "Tokyo Trial", "score" : 0.5 }
6{ "runtime" : 276, "title" : "Warriors of the Rainbow: Seediq Bale", "score" : 0.4000000059604645 }
7{ "runtime" : 283, "title" : "Scenes from a Marriage", "score" : 0.3333333432674408 }

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

다음 예에서는 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 }

위의 Atlas 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}

돌아가기

유사한 콘텐츠 더 보기