Puedes usar la opción returnScope para establecer el contexto de la query y devolver arreglos de objetos como documentos individuales.
Requisitos
Para recuperar objetos anidados como documentos individuales usando returnScope, debes:
Indexa los arreglos de objetos como el tipo embeddedDocuments.
Define storedSource para los campos anidados que desees recuperar. MongoDB Search sólo devuelve los campos definidos en el
storedSource.Configure la opción returnStoredSource en
trueen la query.
Sintaxis
returnScope tiene la siguiente sintaxis en tus consultas:
{ $search: { "<operator>": { <operator-specification>, }, "returnScope": { "path": "<embedded-documents-field-to-retrieve>" }, "returnStoredSource": true } }
{ $searchMeta: { "returnScope": { "path": "<embedded-documents-field-to-retrieve>" }, "returnStoredSource": true }, "facet": { "<operator>": { <operator-specification>, }, "facets": { <facet-definition> } } }
Para obtener más información sobre la sintaxis de query, consulta $search.
Comportamiento
La opción returnScope establece el contexto de obtención para la query. Si especifica returnScope en su consulta, MongoDB Search otorga puntuación, ordena y cuenta cada documento incrustado como si se tratase de un documento individual.
Considerations
Cuando utilizas la opción returnScope, MongoDB Search solo devuelve los campos que configuraste como storedSource dentro del embeddedDocument. No se devuelven los campos fuera de la ruta embeddedDocument (por ejemplo, los campos a nivel de raíz) y los campos que no están configurados como storedSource.
En tu especificación de operador, debes especificar la ruta completa al campo que deseas query. Al usar la opción returnScope, debes asegurarte de que todas las rutas de especificaciones del operador estén anidadas debajo del returnScope.path. Para query sobre un campo fuera del returnScope.path, debe usar el operador hasAncestor o hasRoot. Para obtener más información, consulte:
Recuperar el ID del Documento Raíz
Cuando utiliza returnScope en una query, MongoDB Search rellena un campo de metadatos searchRootDocumentId. Puede utilizar el campo de metadatos searchRootDocumentId en clústeres que ejecutan MongoDB 8.3 o posterior. Este campo contiene el identificador del documento raíz que contiene cada documento incrustado devuelto. Para proyectar este valor, utilice la $meta expresión con la palabra clave searchRootDocumentId.
MongoDB Search popula searchRootDocumentId solo cuando tu query establece tanto returnStoredSource: true como returnScope.path. Si haces referencia a searchRootDocumentId en una query que no especifica returnScope, la query falla con el siguiente error:
query requires $search root document id metadata, but it is not available
Utiliza searchRootDocumentId si deseas:
Busca campos del documento principal después de aplicar filtros a los documentos secundarios.
Agrupa los documentos secundarios por su progenitor.
No uses searchRootDocumentId si:
Solo necesitas campos de los documentos secundarios coincidentes.
Se quiere devolver el documento padre para cada documento hijo en el conjunto de resultados, ya que esto puede ser costoso.
Ejemplos
Los siguientes ejemplos demuestran cómo utilizar la opción returnScope en las consultas. Los ejemplos utilizan el conjunto de datos de muestra sample_training.companies. Si cargas los datos en tu clúster y creas el índice de muestra en los campos de la colección, puedes probar las siguientes consultas con los datos de muestra.
Índice de muestra
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "funding_rounds": { 6 "type": "embeddedDocuments", 7 "dynamic": true, 8 "fields": { 9 "investments": { 10 "type": "embeddedDocuments", 11 "dynamic": true 12 } 13 }, 14 "storedSource": { 15 "include": [ 16 "round_code", 17 "raised_currency_code", 18 "raised_amount", 19 "investments.person", 20 "investments.financial_org" 21 ] 22 } 23 } 24 } 25 } 26 }
La definición de índice anterior configura MongoDB Search para que:
Indexen los campos
funding_roundsyfunding_rounds.investmentscomo el tipoembeddedDocuments.Indiza todos los campos indexables de forma dinámica anidados en el arreglo de objetos
funding_roundsyfunding_rounds.investments.Almacena los siguientes campos en
mongot:funding_rounds.round_codefunding_rounds.raised_currency_codefunding_rounds.raised_amountfunding_rounds.investments.personfunding_rounds.investments.financial_org
Puedes utilizar el operador embeddedDocument para realizar queries por elementos en los campos funding_rounds y funding_rounds.investments. Las siguientes secciones muestran algunas consultas de ejemplo que utilizan la opción returnScope para recuperar los campos embeddedDocuments como documentos individuales.
{ ..., "funding_rounds": [ { "id": <integer>, "round_code": "<string>", "source_url": "<string>", "source_description": "<string>", "raised_amount": <integer>, "raised_currency_code": "<string>", "funded_year": <integer>, "funded_month": "<string>", "funded_day": "<string>", "investments": [ { "company": "<string>", "financial_org": { "name": "<string>", "permalink": "<string>" }, "person": { "first_name": "<string>", "last_name": "<string>", "permalink": "<string>" } }, ... ] }, ... ], ... }
Queries de muestra
Las siguientes secciones demuestran consultas de muestra que utilizan la opción returnScope para recuperar campos en campos de tipo embeddedDocuments que se almacenaron en mongot.