Docs Menu
Docs Home
/
Atlas
/ / / /

저장된 소스 필드 반환

이 페이지의 내용

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

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

기본적으로 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 에서 직접 저장된 필드를 반환해야 하는지 여부를 지정합니다. 인덱스 정의에 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에서 중복 데이터를 반환할 수 있습니다.

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

돌아가기

동시

이 페이지의 내용