Docs Menu
Docs Home
/
MongoDB Atlas
/ / / /

저장된 소스 필드 반환

이 페이지의 내용

  • 구문
  • 행동
  • 샘플 사용
  • 예제

컬렉션에 대한 인덱스 정의 mongot 에서 storedSource 옵션을 구성한 경우 Atlas Search는 지정된 필드를 에 저장합니다.returnStoredSource Atlas Search 쿼리에서 부울 옵션을 사용하면 컬렉션에서 전체 문서를 가져오는 대신 해당 필드만 검색할 수 있습니다.

기본적으로 Atlas Search Atlas Search 쿼리에 대한 문서를 일치시킨 후 백엔드 데이터베이스에서 암시적으로 전체 문서 조회를 수행합니다. 이 조회는 $search 단계에서 일치하는 모든 데이터 세트를 가져오거나(예: $sort, $group) 데이터의 많은 부분을 필터링하는 후속 집계 파이프라인 단계(예: { $match}, $skip 11})의 성능을 크게 저하시킬 수 있습니다. ). storedSource 옵션을 구성한 경우 returnStoredSource 옵션을 사용하여 Atlas Search에 직접 저장된 문서의 일부만 검색하고 데이터베이스에서 전체 문서 조회를 방지할 수 있습니다. 이를 통해 필드 수가 최소화된 문서에 대해 대부분의 데이터베이스 측 필터링 작업을 수행할 수 있습니다. 그런 다음 $lookup 를 사용하여 파이프라인의 후반 단계에서 문서의 모든 필드를 검색할 수 있습니다.

참고

  • returnStoredSource 는 MongoDB 5.0 이상을 실행하는 Atlas cluster에서만 사용할 수 있습니다.

  • 샤드 컬렉션의 경우 $lookup 는 MongoDB 5.1 이상을 실행하는 Atlas 클러스터에서만 사용할 수 있습니다.

returnStoredSource 쿼리에 다음 구문이 있습니다.

{
$search: {
"<operator>": {
<operator-specification>
},
"returnStoredSource": true | false // optional, defaults to "false"
}
}

쿼리 구문에 대해 자세히 알아보려면 $search 를 참조하세요.

returnStoredSource 부울 옵션은 Atlas Search가 데이터베이스에서 전체 문서 조회를 수행해야 하는지, 아니면 Atlas Search에서 직접 저장된 필드를 반환해야 하는지 여부를 지정합니다. 인덱스 정의에 Atlas Search에 필드를 저장하기 위한 구성이 포함된 경우에만 returnStoredSource 옵션을 사용할 수 있습니다. Atlas Search에서 필드를 저장하는 방법에 대해 자세히 알아보려면 Atlas Search 검색 인덱스 구문 검토 및 Atlas Search 검색 인덱스 에서 저장된 소스 필드 정의를 참조하세요.

returnStoredSource 옵션에 대해 다음 값 중 하나를 설정할 수 있습니다.

  • true - Atlas Search에서 직접 저장된 소스 필드만 반환

  • false - 백엔드 데이터베이스에서 암시적 전체 문서 조회 수행(기본값)

returnStoredSource 부울 옵션을 true 로 설정하여 Atlas Search 검색 쿼리를 실행하는 경우:

  • 문서에 저장하도록 구성된 필드가 포함되어 있지 않은 경우 Atlas Search는 빈 문서를 반환합니다.

  • 인덱스 정의에 저장된 소스 구성이 포함되어 있지 않은 경우 Atlas Search에서 오류를 반환합니다.

  • Atlas Search는 복제 지연으로 인해 오래된 데이터를 반환할 수 있습니다.

  • Atlas Search는 샤딩된 cluster에서 중복 데이터를 반환할 수 있습니다.

백엔드 데이터베이스에서 컬렉션에 대해 대량의 데이터 삽입 및 업데이트 작업을 수행하는 경우 에 저장된 데이터가 복제 지연으로 인해 최신 상태가 아닐 수 있으므로 Atlas Search에서 오래된 데이터를 반환할 수 있습니다. Atlas UI의 mongot oplog 에서 Atlas Search가 변경 사항을 복제하는 mongod 데 지연된 대략적인 시간(밀리초)을 확인할 수 있습니다. 자세히 알아보려면 Atlas Search 지표 검토를 참조하세요.

청크 마이그레이션 중에 고아 문서 가 있는 경우, Atlas Search는 샤드 클러스터에 대한 쿼리에 대해 중복 문서를 반환할 수 있습니다.

$search 단계에서 많은 결과가 삭제되고 데이터베이스에서 암시적 문서 조회를 수행해야 하는 경우 returnStoredSource 옵션을 사용하는 것이 좋습니다. 정렬 또는 필터링에 필요한 필드를 저장하고 쿼리 시 returnStoredSource 옵션을 사용하여 다음 조치를 수행할 수 있습니다.

  1. Atlas Search에서 반환된 문서에 대한 중간 작업

  2. $lookup 전체 문서가 필요한 경우 파이프라인 끝에서

중요

효율성을 위해 Atlas Search에 저장할 최소 필드 수만 구성하세요. 문서가 조회 중에 문제를 일으킬 만큼 큰 경우 이 옵션을 사용합니다.

이 섹션의 예제에서는 sample_mflix.movies collection을 사용합니다. 예제에서는 Atlas Search가 $search 단계 이후에 반환하는 문서를 정렬 또는 일치시킨 다음 데이터베이스에서 문서를 조회하는 방법을 보여 줍니다.

  1. 다음 인덱스 정의를 사용하여 인덱스를 생성합니다. 컬렉션에 대한 인덱스 정의는 다음 필드를 지정합니다.

    • 인덱스 title 필드

    • yeartitle 필드 저장

    {
    "mappings": {
    "fields": {
    "title": {
    "type": "string"
    }
    }
    },
    "storedSource": {
    "include": [
    "year",
    "title"
    ]
    }
    }
  2. collection에 대해 다음 쿼리를 실행합니다.

    db.movies.aggregate([
    {
    // search and output documents
    $search: {
    "text": {
    "query": "baseball",
    "path": "title"
    },
    "returnStoredSource": true // return stored fields only
    }
    },
    // fetch all matched dataset from $search stage and sort it
    {
    $sort: {"year": 1, "title": 1}
    },
    // discard everything except top 10 results
    {
    $limit: 10
    },
    // perform full document lookup for top 10 documents only
    {
    $lookup: {
    from: "movies", localField: "_id", foreignField: "_id", as: "document"
    }
    }
    ])

    이 쿼리는 다음 문서를 반환합니다.

    1[
    2 {
    3 _id: ObjectId("573a1399f29313caabced370"),
    4 title: 'Mr. Baseball',
    5 year: 1992,
    6 document: [
    7 { ... } // full document returned by $lookup
    8 ]
    9 },
    10 {
    11 _id: ObjectId("573a1399f29313caabcee1aa"),
    12 title: 'Baseball',
    13 year: 1994,
    14 document: [
    15 { ... } // full document returned by $lookup
    16 ]
    17 }
    18]
  1. 다음 인덱스 정의를 사용하여 인덱스를 생성합니다. 컬렉션에 대한 인덱스 정의는 다음 필드를 지정합니다.

    • 인덱스 title 필드

    • imdb.ratingimdb.votes 필드 저장

    {
    "mappings": {
    "fields": {
    "title": {
    "type": "string"
    }
    }
    },
    "storedSource": {
    "include": [
    "imdb.rating",
    "imdb.votes"
    ]
    }
    }
  2. collection에 대해 다음 쿼리를 실행합니다.

    db.movies.aggregate([
    {
    // search and output documents
    $search: {
    "text": {
    "query": "baseball",
    "path": "title"
    },
    "returnStoredSource": true // return stored fields only
    }
    },
    // filter dataset from $search stage using $match
    {
    $match: {$or: [ { "imdb.rating": { $gt: 8.2 } }, { "imdb.votes": { $gte: 4500 } } ]}
    },
    // perform full document lookup for matched documents only
    {
    $lookup: {
    from: "movies", localField: "_id", foreignField: "_id", as: "document"
    }
    }
    ])

    이 쿼리는 다음 문서를 반환합니다.

    1[
    2 {
    3 _id: ObjectId("573a1399f29313caabcee1aa"),
    4 imdb: { rating: 9.1, votes: 2460 },
    5 document: [
    6 { ... } // full document returned by $lookup
    7 ]
    8 },
    9 {
    10 _id: ObjectId("573a1399f29313caabced370"),
    11 imdb: { rating: 5.8, votes: 7617 },
    12 document: [
    13 { ... } // full document returned by $lookup
    14 ]
    15 }
    16]

돌아가기

6. 검색어 추적

이 페이지의 내용