Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / / /

Devolver campos de origem armazenados

Nesta página

  • Sintaxe
  • Comportamento
  • Amostra de uso
  • Exemplos

Se você configurou a opção storedSource na definição do índice para uma coleção, o Atlas Search armazena os campos especificados em mongot. Você pode usar a opção booleana returnStoredSource em suas consultas do Atlas Search para recuperar somente esses campos, em vez de buscar documentos completos da coleção.

Por padrão, o Atlas Search realiza a pesquisa completa de documentos implicitamente no banco de dados de backend depois que o Atlas Search faz a correspondência dos documentos para a query. Essa pesquisa pode degradar significativamente o desempenho dos estágios subsequentes do pipeline de agregação que obtêm todo o conjunto de dados correspondente do estágio $search (como $sort, $group) ou filtram uma grande parte dele (como $match, $skip). Se você configurou a opção storedSource , você poderá utilizar a opção returnStoredSource para recuperar somente partes dos documentos armazenados diretamente no Atlas Search e evitar a pesquisa de documentos completos no banco de dados. Isso permite que você realize a maioria das operações de filtragem do lado do banco de dados em documentos com um número mínimo de campos. Você pode então recuperar todos os campos dos documentos em um estágio posterior do pipeline usando $lookup.

Observação

  • returnStoredSource está disponível apenas em cluster do Atlas que executam o MongoDB 5.0 e versões mais recentes.

  • Para collections fragmentadas, o $lookup está disponível somente em clusters Atlas que executam o MongoDB 5.1 e posterior.

returnStoredSource tem a seguinte sintaxe em suas queries:

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

Para saber mais sobre sintaxe de query, consulte $search.

A opção booleana returnStoredSource especifica se o Atlas Search deve executar um campo completo de documento no reconhecimento de data center ou retornar os campo armazenados diretamente do Atlas Search. Você pode utilizar a opção returnStoredSource somente se sua definição de índice incluir a configuração para armazenar campo no Atlas Search. Para saber mais sobre como armazenar campo no Atlas Search, consulte Revisar a sintaxe de índice de pesquisa do Atlas Search e definir campo de origem armazenados no seu índice de pesquisa do Atlas Search.

Você pode definir um dos seguintes valores para a opção returnStoredSource :

  • true - para retornar somente campo de origem armazenados diretamente do Atlas Search

  • false - para fazer uma pesquisa implícita de documento completo no reconhecimento de data center de backend (padrão)

Se você executar query de pesquisa do Atlas Search com a opção booleana returnStoredSource definida como true:

  • O Atlas Search retorna um documento vazio se o documento não incluir os campos configurados para armazenamento.

  • Atlas Search retorna erros se a definição de índice não incluir a configuração de Origem Armazenada.

  • O Atlas Search pode retornar dados obsoletos devido a um atraso de replicação.

  • Atlas Search pode retornar dados duplicados em clusters fragmentados.

Se você realizar um alto volume e uma taxa de operações de inserção e atualização de dados para sua coleção no banco de dados de backend, o Atlas Search poderá retornar dados obsoletos porque os dados armazenados em mongot podem não estar atualizados devido a um atraso na replicação. Você pode visualizar o número aproximado de milissegundos que o Atlas Search está atrasado na replicação de alterações a partir do oplog de mongod na IU do Atlas . Para saber mais, consulte Revisar métricas do Atlas Search.

Se houver documentos órfãos durante a migração de chunk, o Atlas Search poderá retornar documentos duplicados para queries no cluster fragmentado.

Se o estágio $search descartar muitos resultados e você precisar realizar uma pesquisa implícita de documentos no seu banco de dados, recomendamos usar a opção returnStoredSource . Você pode armazenar os campos necessários para classificação ou filtragem e usar a opção returnStoredSource no momento da query para executar as seguintes ações:

  1. Operações intermediárias em documentos parciais retornados pelo Atlas Search

  2. $lookup no final do pipeline, se forem necessários documentos completos.

Importante

Para maior eficiência, configure apenas um número mínimo de campo para armazenamento no Atlas Search. Use essa opção se seus documentos forem grandes o suficiente para causar problemas durante a pesquisa.

Os exemplos nesta seção usam a collection sample_mflix.movies . Os exemplos mostram como fazer uma classificação ou correspondência nos documentos que o Atlas Search retorna após o estágio $search e, em seguida, pesquisar documentos no banco de dados.

  1. Crie o índice utilizando a seguinte definição de índice. A definição de índice para a collection especifica os seguintes campo:

    • Campo de índice title

    • Armazenar campos year e title

    {
    "mappings": {
    "fields": {
    "title": {
    "type": "string"
    }
    }
    },
    "storedSource": {
    "include": [
    "year",
    "title"
    ]
    }
    }
  2. Execute a seguinte query em relação à 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"
    }
    }
    ])

    A consulta retorna os seguintes documentos:

    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. Crie o índice utilizando a seguinte definição de índice. A definição de índice para a collection especifica os seguintes campo:

    • Campo de índice title

    • Armazenar campos imdb.rating e imdb.votes

    {
    "mappings": {
    "fields": {
    "title": {
    "type": "string"
    }
    }
    },
    "storedSource": {
    "include": [
    "imdb.rating",
    "imdb.votes"
    ]
    }
    }
  2. Execute a seguinte query em relação à 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"
    }
    }
    ])

    A consulta retorna os seguintes documentos:

    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]

Voltar

6. Rastrear termos de pesquisa