Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

hasAncestor Operador

hasAncestor

El operador hasAncestor consulta un campo de tipo embeddedDocuments que especifiques en el ancestorPath. El ancestorPath es padre del campo que usted especifica en el returnScope. El returnScope especifica el campo anidado, incluido el nivel de anidación, que deseas recuperar.

Puedes usar este operador al puntuar y recuperar objetos dentro de matrices como documentos independientes para:

  • Filtrar en campos ancestrales (nivel de anidación superior).

  • Filtrar en los campos hermanos (igual nivel de anidamiento).

El operador hasAncestor tiene la siguiente sintaxis:

1{
2 $search: {
3 "index": "<index name>", // optional, defaults to "default"
4 "hasAncestor": {
5 "ancestorPath": "<embeddedDocuments-type-higher-level-field>",
6 "operator": {
7 <operator-specification>
8 }
9 },
10 "returnScope": {
11 "path": "<embeddedDocuments-type-field-to-retrieve>"
12 }
13 }
14}
Campo
Tipo
Descripción
Necesidad

ancestorPath

String

Nombre del campo de tipo embeddedDocuments que es un ancestro intermedio del campo anidado utilizado en la query. Éste es el documento principal que el operador evalúa.

Requerido

operator

Objeto

Operador a utilizar para consultar el campo anidado dentro del campo tipo embeddedDocuments especificado en el ancestorPath. La ruta de query debe ser un subelemento de ancestorPath, independientemente del nivel de anidamiento. Esto especifica los criterios de búsqueda para filtrar el documento principal.

No puedes usar el operador hasAncestor dentro de la especificación del operador.

Requerido

Para utilizar este operador, debe:

  • Indexa los campos ancestrales como el tipo embeddedDocuments. En la consulta, especifica ancestorPath como este campo. Si el campo está en el nivel raíz, utiliza hasRoot.

  • Especifica returnScope para establecer el alcance del documento para consultar y recuperar.

Los ejemplos en esta sección usan el conjunto de datos sample_training.companies. Si cargas el dataset de muestra y creas el índice en la colección, puedes probar las queries de muestra demostradas en esta sección.

Las consultas de esta sección utilizan el siguiente índice. Esta definición de índice configura MongoDB Search para que haga lo siguiente:

  • Indexe automáticamente todos los campos indexables dinámicos en la colección.

  • Indexa los campos funding_rounds y funding_rounds.investments como el tipo embeddedDocuments.

  • Almacena los siguientes campos en mongot:

    • funding_rounds.investments.financial_org

    • funding_rounds.investments.person

1{
2 "mappings": {
3 "dynamic": true,
4 "fields": {
5 "funding_rounds": {
6 "dynamic": true,
7 "fields": {
8 "investments": [
9 {
10 "dynamic": true,
11 "storedSource": {
12 "include": [
13 "financial_org",
14 "person"
15 ]
16 },
17 "type": "embeddedDocuments"
18 }
19 ]
20 },
21 "type": "embeddedDocuments"
22 }
23 }
24 }
25}

La siguiente query busca en el campo funding_rounds.founded_year empresas que fueron fundadas en el año 2005 utilizando el operador equals para recuperar detalles de inversión, como las organizaciones financieras o personas que invirtieron en las empresas.

1db.companies.aggregate([
2 {
3 "$search": {
4 "returnStoredSource": true,
5 "returnScope": { "path": "funding_rounds.investments" },
6 "hasAncestor": {
7 "ancestorPath": "funding_rounds",
8 "operator": {
9 "equals": {
10 "path": "funding_rounds.funded_year",
11 "value": 2005
12 }
13 }
14 }
15 }
16 }
17])
[
{
financial_org: {
name: 'Frazier Technology Ventures',
permalink: 'frazier-technology-ventures'
},
person: null
},
{
financial_org: { name: 'Trinity Ventures', permalink: 'trinity-ventures' },
person: null
},
{
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'
}
},
{
financial_org: { name: 'First Round Capital', permalink: 'first-round-capital' },
person: null
},
{
financial_org: null,
person: {
first_name: 'Ram',
last_name: 'Shriram',
permalink: 'ram-shriram'
}
},
{
financial_org: null,
person: {
first_name: 'Mitch',
last_name: 'Kapor',
permalink: 'mitch-kapor'
}
},
{
financial_org: null,
person: { first_name: 'Ron', last_name: 'Conway', permalink: 'ron-conway' }
},
{
financial_org: null,
person: {
first_name: 'Silvio',
last_name: 'Scaglia',
permalink: 'silvio-scaglia'
}
},
{
financial_org: {
name: 'Shelter Capital Partners',
permalink: 'shelter-capital-partners'
},
person: null
},
{
financial_org: { name: 'First Round Capital', permalink: 'first-round-capital' },
person: null
},
{
financial_org: {
name: 'Liberty Associated Partners',
permalink: 'liberty-associated-partners'
},
person: null
},
{
financial_org: { name: 'Rose Tech Ventures', permalink: 'rose-tech-ventures' },
person: null
},
{
financial_org: { name: 'First Round Capital', permalink: 'first-round-capital' },
person: null
},
{
financial_org: { name: 'Lead Dog Ventures', permalink: 'lead-dog-ventures' },
person: null
},
{
financial_org: { name: 'Accel Partners', permalink: 'accel-partners' },
person: null
},
{
financial_org: { name: 'Benchmark', permalink: 'benchmark-2' },
person: null
},
{
financial_org: { name: 'Sequoia Capital', permalink: 'sequoia-capital' },
person: null
},
{ financial_org: null, person: null }
]