Devolver campos de origem armazenados
Nesta página
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.
Sintaxe
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
.
Comportamento
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 Searchfalse
- 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.
Amostra de uso
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:
Operações intermediárias em documentos parciais retornados pelo Atlas Search
$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.
Exemplos
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.
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
etitle
{ "mappings": { "fields": { "title": { "type": "string" } } }, "storedSource": { "include": [ "year", "title" ] } } 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 ]
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
eimdb.votes
{ "mappings": { "fields": { "title": { "type": "string" } } }, "storedSource": { "include": [ "imdb.rating", "imdb.votes" ] } } 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 ]