Puedes utilizar el returnScope Opción para establecer el contexto de la consulta y devolver matrices de objetos como documentos individuales.
Requisitos
Para recuperar objetos anidados como documentos individuales utilizando returnScope, debe:
Indexar las matrices de objetos como tipoembeddedDocuments.
Defina "storedSource" para los campos anidados que desea recuperar. MongoDB Search solo devuelve los campos definidos
storedSourceen.Establezca la opción returnStoredSource en
trueen la consulta.
Sintaxis
returnScope tiene la siguiente sintaxis en tus consultas:
Para obtener más información sobre la sintaxis de consulta,$search consulte.
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
Al usar la opción returnScope, MongoDB Search solo devuelve los campos configurados como storedSource dentro de embeddedDocument. Los campos fuera de la ruta embeddedDocument (como los campos en el nivel raíz) y los que no están configurados como storedSource no se devuelven.
En la especificación del operador, debe especificar la ruta completa al campo que desea consultar. Al usar la opción returnScope, asegúrese de que todas las rutas de las especificaciones del operador estén anidadas bajo returnScope.path. Para consultar un campo fuera de returnScope.path, debe usar el operador hasAncestor o hasRoot. Para obtener más información, consulte:
Ejemplos
Los siguientes ejemplos muestran cómo usar la opción returnScope en las consultas. Los ejemplos utilizan el conjunto de datos de ejemplo sample_training.companies. Si carga los datos en su clúster y crea el índice de ejemplo en los campos de la colección, puede probar las siguientes consultas con los datos de ejemplo.
Í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:
Indexe los campos
funding_roundsyfunding_rounds.investmentscomo el tipoembeddedDocuments.Indexa todos los campos indexables dinámicamente anidados en la matriz de objetos
funding_roundsyfunding_rounds.investments.Almacene los siguientes campos en
mongot:funding_rounds.round_codefunding_rounds.raised_currency_codefunding_rounds.raised_amountfunding_rounds.investments.personfunding_rounds.investments.financial_org
Puede usar el embeddedDocument operador para realizar consultas elemento por elemento funding_rounds en funding_rounds.investments los campos y. Las siguientes secciones muestran algunos ejemplos de consultas que usan la returnScope opción para recuperar los embeddedDocuments campos 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.
La siguiente consulta utiliza el range operador de búsqueda (MongoDB) para consultar el funding_rounds.raised_amount campo en busca de cantidades mayores o iguales a 5000000 y menores o iguales 10000000 a. Establece el ámbito de la consulta en el campo funding_rounds mediante la returnScope opción. Devuelve todos los campos almacenados en la funding_rounds matriz de objetos, incluidos los campos de la funding_rounds.investments matriz de objetos que se almacenaron con la returnStoredSource opción. Limita el número de resultados a solo 5 funding_rounds documentos.
1 db.companies.aggregate( 2 { 3 "$search": { 4 "range": { 5 "path": "funding_rounds.raised_amount", 6 "gte": 5000000, 7 "lte": 10000000 8 }, 9 "returnStoredSource": true, 10 "returnScope": { 11 "path": "funding_rounds" 12 } 13 } 14 }, 15 { 16 "$limit": 5 17 } 18 )
[ { round_code: 'a', raised_amount: 5250000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Frazier Technology Ventures', permalink: 'frazier-technology-ventures' }, person: null }, { financial_org: { name: 'Trinity Ventures', permalink: 'trinity-ventures' }, person: null } ] }, { round_code: 'b', raised_amount: 9500000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Accel Partners', permalink: 'accel-partners' }, person: null }, { financial_org: { name: 'Frazier Technology Ventures', permalink: 'frazier-technology-ventures' }, person: null }, { financial_org: { name: 'Trinity Ventures', permalink: 'trinity-ventures' }, person: null } ] }, { round_code: 'a', raised_amount: 5000000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Charles River Ventures', permalink: 'charles-river-ventures' }, person: null }, { financial_org: { name: 'Union Square Ventures', permalink: 'union-square-ventures' }, person: null }, { financial_org: null, person: { first_name: 'Marc', last_name: 'Andreessen', permalink: 'marc-andreessen' } }, { financial_org: null, person: { first_name: 'Dick', last_name: 'Costolo', permalink: 'dick-costolo' } }, { financial_org: null, person: { first_name: 'Naval', last_name: 'Ravikant', permalink: 'naval-ravikant' } }, { financial_org: null, person: { first_name: 'Ron', last_name: 'Conway', permalink: 'ron-conway' } }, { financial_org: null, person: { first_name: 'Chris', last_name: 'Sacca', permalink: 'chris-sacca' } }, { financial_org: null, person: { first_name: 'Greg', last_name: 'Yaitanes', permalink: 'greg-yaitanes' } }, { financial_org: null, person: { first_name: 'Brian', last_name: 'Pokorny', permalink: 'brian-pokorny' } }, { financial_org: { name: 'SV Angel', permalink: 'sv-angel' }, person: null } ] }, { round_code: 'e', raised_amount: 5166511, raised_currency_code: 'USD', investments: [] }, { round_code: 'b', raised_amount: 9000000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Charles River Ventures', permalink: 'charles-river-ventures' }, person: null }, { financial_org: { name: 'Redpoint Ventures', permalink: 'redpoint-ventures' }, person: null }, { financial_org: { name: 'The Kinsey Hills Group', permalink: 'kinsey-hills-group' }, person: null } ] } ]
La siguiente consulta utiliza el compound operador para buscar múltiples niveles de embeddedDocuments campos anidados en la misma consulta:
Debe coincidir ``funding_rounds.raised_currency_code`` con
USDDebe coincidir
funding_rounds.investments.financial_org.nameconTrinity Ventures
Devuelve todos los campos almacenados en la matriz de objetos funding_rounds, incluidos los campos en funding_rounds.investments. Limita el número de resultados a solo 5 funding_rounds documentos.
1 db.companies.aggregate( 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "text": { 7 "path": "funding_rounds.raised_currency_code", 8 "query": "usd" 9 } 10 }], 11 "should": [{ 12 "phrase": { 13 "path": "funding_rounds.investments.financial_org", 14 "query": "Trinity Ventures", 15 } 16 }] 17 }, 18 "returnStoredSource": true, 19 "returnScope": { 20 "path": "funding_rounds" 21 } 22 } 23 }, 24 { 25 "$limit": 5 26 } 27 )
[ { round_code: 'a', raised_amount: 5250000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Frazier Technology Ventures', permalink: 'frazier-technology-ventures' }, person: null }, { financial_org: { name: 'Trinity Ventures', permalink: 'trinity-ventures' }, person: null } ] }, { round_code: 'b', raised_amount: 9500000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Accel Partners', permalink: 'accel-partners' }, person: null }, { financial_org: { name: 'Frazier Technology Ventures', permalink: 'frazier-technology-ventures' }, person: null }, { financial_org: { name: 'Trinity Ventures', permalink: 'trinity-ventures' }, person: null } ] }, { round_code: 'c', raised_amount: 25000000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'DAG Ventures', permalink: 'dag-ventures' }, person: null }, { financial_org: { name: 'Accel Partners', permalink: 'accel-partners' }, person: null }, { financial_org: { name: 'Trinity Ventures', permalink: 'trinity-ventures' }, person: null }, { financial_org: { name: 'Frazier Technology Ventures', permalink: 'frazier-technology-ventures' }, person: null } ] }, { round_code: 'angel', raised_amount: 500000, raised_currency_code: 'USD', investments: [ { financial_org: null, person: { first_name: 'Peter', last_name: 'Thiel', permalink: 'peter-thiel' } }, { financial_org: null, person: { first_name: 'Reid', last_name: 'Hoffman', permalink: 'reid-hoffman' } } ] }, { round_code: 'a', raised_amount: 12700000, raised_currency_code: 'USD', investments: [ { financial_org: { name: 'Accel Partners', permalink: 'accel-partners' }, person: null }, { financial_org: null, person: { first_name: 'Mark', last_name: 'Pincus', permalink: 'mark-pincus' } }, { financial_org: null, person: { first_name: 'Reid', last_name: 'Hoffman', permalink: 'reid-hoffman' } } ] } ]