Se você configurou a opçãostoredSource na definição de índice para uma coleção, o MongoDB Search armazenará os campos especificados mongot
no. Você pode usar a opção returnStoredSource
boolean em suas queries do MongoDB Search para recuperar apenas esses campos, em vez de buscar documentos completos da collection.
Por padrão, o MongoDB Search realiza a pesquisa completa de documento implicitamente no banco de dados de backend depois que o MongoDB Search corresponde aos 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 storedSource
opção, você poderá usar a returnStoredSource
opção para recuperar apenas partes dos documentos armazenados diretamente no MongoDB Search e evitar a pesquisa completa de documento 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 $lookup
usando.
Observação
returnStoredSource
está disponível apenas em clusters Atlas que executam o MongoDB 7.0 e versões posteriores.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 returnStoredSource
opção booleana especifica se o MongoDB Search deve executar uma pesquisa completa de documento no banco de dados ou retornar os campos armazenados diretamente do MongoDB Search. Você pode usar a returnStoredSource
opção somente se a definição do índice incluir a configuração para armazenar campos no MongoDB Search. Para saber mais sobre como armazenar campos na MongoDB Search, consulte Referência de índice e Definir campos de origem armazenados no seu índice do MongoDB Search.
Você pode definir um dos seguintes valores para a opção returnStoredSource
:
true
- para retornar apenas campos de origem armazenados diretamente da Pesquisa MongoDBfalse
- para fazer uma pesquisa implícita de documento completo no reconhecimento de data center de backend (padrão)
Se você executar queries de pesquisa MongoDB com a opção booleana returnStoredSource
definida como true
:
A Pesquisa do MongoDB retornará um documento vazio se o documento não incluir os campos configurados para armazenamento.
A Pesquisa do MongoDB retorna erros se a definição do índice não incluir a configuração Fonte armazenada.
A pesquisa do MongoDB pode retornar dados obsoletos devido a um atraso de replicação.
A Pesquisa do MongoDB pode retornar dados duplicados em clusters fragmentados.
Se você executar um alto volume e taxa de operações de inserção e atualização de dados para sua coleção no banco de dados de backend, o MongoDB Search poderá retornar dados obsoletos porque os dados armazenados no mongot
podem não ser atuais devido a um atraso de replicação. Você pode visualizar o número aproximado de milissegundos que a pesquisa do MongoDB está atrasada ao replicar as alterações do oplog de mongod
na UI do Atlas . Para saber mais, consulte Revisar métricas de pesquisa do MongoDB .
Se houver documentos órfãos durante a migração de chunk, a Pesquisa do MongoDB poderá retornar documentos duplicados para queries em 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 pela pesquisa MongoDB
$lookup
no final do pipeline, se forem necessários documentos completos.
Importante
Para maior eficiência, configure apenas um número mínimo de campos para armazenamento no MongoDB Search. Use essa opção se seus documentos forem grandes o suficiente para causar problemas durante a pesquisa.
Exemplos
Os exemplos nesta seção utilizam a collection sample_mflix.movies
. Os exemplos mostram como fazer uma classificação ou correspondência nos documentos que o MongoDB 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 ]