Se você configurou a opção storedSource na definição de índice para uma collection, o MongoDB Search armazenará os campos especificados no mongot. Você pode usar a opção boolean returnStoredSource em suas queries do MongoDB Search para recuperar apenas esses campos, em vez de buscar documentos completos da collection.
By default, MongoDB Search performs full document lookup implicitly on the backend database after MongoDB Search matches documents for the query. This lookup could significantly degrade performance for subsequent aggregation pipeline stages that fetch all matched dataset from $search stage (such as $sort, $group) or filter a large part of it (such as $match, $skip). If you configured the storedSource option, you can use the returnStoredSource option to retrieve only parts of the documents directly stored on MongoDB Search and avoid full document lookup on the database. This allows you to perform most database-side filtering operations on documents with a minimum number of fields. You can then retrieve all the fields from the documents at a later stage in the pipeline using $lookup.
Observação
returnStoredSourceestá disponível apenas em seus clusters que executam o MongoDB 7.0 e versões posteriores.For sharded collections,
$lookupis only available on clusters running MongoDB 5.1 and later.
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 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 opção returnStoredSource 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.
If you perform a high volume and rate of data insert and update operations for your collection on the backend database, MongoDB Search might return stale data because the data stored on mongot might not be current due to a replication lag. You can view the approximate number of milliseconds that MongoDB Search is behind in replicating changes from the oplog of mongod in the Atlas UI. To learn more, see Review MongoDB Search Metrics.
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
$lookupno 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
titleArmazenar campos
yearetitle
{ "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
titleArmazenar campos
imdb.ratingeimdb.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 ]