정의
구문
hasRoot 의 구문은 다음과 같습니다:
1 { 2 $search: { 3 "index": "<index name>", // optional, defaults to "default" 4 "hasRoot": { 5 "operator": { 6 <operator-specification> 7 } 8 }, 9 "returnScope": { 10 "path": "<embedded-documents-field-to-retrieve>" 11 }, 12 "returnStoredSource": true, 13 } 14 }
필드
필드 | 유형 | 설명 | 필요성 |
|---|---|---|---|
| 객체 | 인덱스 필드 쿼리에 사용할 연산자입니다. 자식 문서를 필터링하기 위한 검색 기준을 지정합니다. | 필수 사항 |
요구 사항:
이 연산자를 사용하려면 인덱스 정의에서 다음 작업을 수행해야 합니다.
쿼리할 루트 수준 필드를 인덱스합니다.
조회할 객체 배열을
embeddedDocuments유형으로 인덱싱합니다. 조회하려는 중첩 필드에 대해storedSource를 구성해야 합니다.
쿼리에서 다음을 수행해야 합니다.
연산자를 검색할 필드 범위를 설정하려면
returnScope를 지정합니다.storedSource필드를 반환하려면returnStoredSource를true로 설정합니다.
예시
이 섹션의 예시에서는 sample_training.companies 네임스페이스를 사용합니다. 샘플 데이터세트를 로드하고 컬렉션에 인덱스를 생성하면 이 섹션에서 설명하는 샘플 쿼리를 시도해 볼 수 있습니다.
샘플 인덱스
이 섹션의 쿼리에서는 다음 인덱스를 사용합니다. 이 인덱스 정의는 MongoDB 검색을 다음 작업을 수행하도록 구성합니다.
컬렉션에서 동적으로 인덱싱할 수 있는 모든 필드를 자동으로 인덱싱합니다.
products,funding_rounds,funding_rounds.investments필드를 embeddedDocuments 유형으로 인덱스합니다.mongot에 다음 필드를 저장합니다.funding_rounds.raised_currency_codefunding_rounds.raised_amountfunding_rounds.investmentsproducts.name
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "funding_rounds": { 6 "dynamic": true, 7 "fields": { 8 "investments": [ 9 { 10 "dynamic": true, 11 "type": "embeddedDocuments" 12 } 13 ] 14 }, 15 "storedSource": { 16 "include": [ 17 "raised_currency_code", 18 "raised_amount", 19 "investments" 20 ] 21 }, 22 "type": "embeddedDocuments" 23 }, 24 "products": { 25 "dynamic": true, 26 "storedSource": { 27 "include": [ 28 "name" 29 ] 30 }, 31 "type": "embeddedDocuments" 32 } 33 } 34 } 35 }
간단한 쿼리
다음 쿼리는 루트 수준 필드 founded_year가 2005년과 2010년 사이에 있을 때 products을 반환합니다.
1 db.companies.aggregate([ 2 { 3 "$search": { 4 "returnStoredSource": true, 5 "returnScope": { "path": "products" }, 6 "hasRoot": { 7 "operator": { 8 "range": { 9 "path": "founded_year", 10 "gte": 2005, 11 "lte": 2010 12 } 13 } 14 } 15 } 16 } 17 ])
[ { name: 'Wikison Wetpaint' }, { name: 'Wetpaint Social Distribution System' }, { name: 'Omnidrive' }, { name: 'Twitter Blocks' }, { name: 'Twicco' }, { name: 'Slacker Web Player' }, { name: 'Slacker Desktop Radio' }, { name: 'Slacker Portable Player' }, { name: 'Babelgum' }, { name: 'Powerset' }, { name: 'OpenX Enterprise' }, { name: 'OpenX Market' }, { name: 'OpenX Lift' }, { name: 'Sparter' }, { name: 'Thoof' }, { name: 'MyFree411' }, { name: 'Wesabe' }, { name: 'Prosper' }, { name: 'Stickam' }, { name: 'PayPerLive.com' } ]
멀티 레벨 쿼리
다음 쿼리는 Facebook 이라는 회사의 name 필드를 text 연산자를 사용하여 검색하고, 모든 투자자(investments.person 와 investments.financial_org)가 회사에 투자한 금액(funding_rounds.raised_amount 과 funding_rounds.raised_currency_code)을 조회합니다.
1 db.companies.aggregate([ 2 { 3 "$search": { 4 "returnStoredSource": true, 5 "returnScope": { "path": "funding_rounds" }, 6 "hasRoot": { 7 "operator": { 8 "text": { 9 "path": "name", 10 "query": "Facebook" 11 } 12 } 13 } 14 } 15 } 16 ])
[ { raised_amount: 500000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: null, person: { first_name: 'Peter', last_name: 'Thiel', permalink: 'peter-thiel' } }, { company: null, financial_org: null, person: { first_name: 'Reid', last_name: 'Hoffman', permalink: 'reid-hoffman' } } ] }, { raised_amount: 12700000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Accel Partners', permalink: 'accel-partners' }, person: null }, { company: null, financial_org: null, person: { first_name: 'Mark', last_name: 'Pincus', permalink: 'mark-pincus' } }, { company: null, financial_org: null, person: { first_name: 'Reid', last_name: 'Hoffman', permalink: 'reid-hoffman' } } ] }, { raised_amount: 27500000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Greylock Partners', permalink: 'greylock' }, person: null }, { company: null, financial_org: { name: 'Meritech Capital Partners', permalink: 'meritech-capital-partners' }, person: null }, { company: null, financial_org: { name: 'Founders Fund', permalink: 'founders-fund' }, person: null }, { company: null, financial_org: { name: 'SV Angel', permalink: 'sv-angel' }, person: null } ] }, { raised_amount: 240000000, raised_currency_code: 'USD', investments: [ { company: { name: 'Microsoft', permalink: 'microsoft' }, financial_org: null, person: null } ] }, { raised_amount: 60000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: null, person: { first_name: 'Li', last_name: 'Ka-shing', permalink: 'li-ka-shing' } }, { company: null, financial_org: { name: 'Horizons Ventures', permalink: 'horizons-ventures' }, person: null } ] }, { raised_amount: 15000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'European Founders Fund', permalink: 'european-founders-fund' }, person: null } ] }, { raised_amount: 100000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'TriplePoint Capital', permalink: 'triplepoint-capital' }, person: null } ] }, { raised_amount: 60000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: null, person: { first_name: 'Li', last_name: 'Ka-shing', permalink: 'li-ka-shing' } }, { company: null, financial_org: { name: 'Horizons Ventures', permalink: 'horizons-ventures' }, person: null } ] }, { raised_amount: 200000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Digital Sky Technologies', permalink: 'digital-sky-technologies-fo' }, person: null } ] }, { raised_amount: 210000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Elevation Partners', permalink: 'elevation-partners' }, person: null } ] }, { raised_amount: 1500000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Goldman Sachs', permalink: 'goldman-sachs' }, person: null }, { company: null, financial_org: { name: 'Digital Sky Technologies', permalink: 'digital-sky-technologies-fo' }, person: null } ] } ]
복합 쿼리
다음 쿼리는 중첩된 funding_rounds.investments 필드에서 name 필드 내 어디에서든 Ventures라는 텀을 가진 금융 조직을 검색하며, 이 조직은 description 필드 내 어디에서든 network라는 텀으로 설명된 회사에 투자한 것입니다. 쿼리는 compound 연산자를 사용하여 다음을 검색합니다.
embeddedDocument연산자를 사용하여 중첩된funding_rounds.investments.financial_org.name필드루트 수준
description필드에hasRoot연산자 사용
returnScope는 연산자의 컨텍스트를 funding_rounds embeddedDocuments 유형 필드로 설정하며, returnStoredSource 필드는 true로 설정되어 storedSource 필드만 반환합니다. 이 쿼리는 결과 목록을 5개의 문서로 제한합니다.
1 db.companies.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "should": [ 6 { 7 "embeddedDocument": { 8 "path": "funding_rounds.investments", 9 "operator": { 10 "wildcard": { 11 "path": "funding_rounds.investments.financial_org.name", 12 "query": "*Ventures*", 13 "allowAnalyzedField": true 14 } 15 } 16 } 17 }, 18 { 19 "hasRoot": { 20 "operator": { 21 "wildcard": { 22 "path": "description", 23 "query": "*network*", 24 "allowAnalyzedField": true 25 } 26 } 27 } 28 } 29 ] 30 }, 31 "returnScope": {"path": "funding_rounds"}, 32 "returnStoredSource": true 33 } 34 }, 35 { 36 "$limit": 5 37 } 38 ])
[ { raised_amount: 6500000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Velocity Interactive Group', permalink: 'velocity-interactive-group' }, person: null }, { company: null, financial_org: { name: 'TELUS Ventures', permalink: 'telus-ventures' }, person: null }, { company: null, financial_org: { name: 'Charles River Ventures', permalink: 'charles-river-ventures' }, person: null }, { company: null, financial_org: { name: 'Partech Ventures', permalink: 'partech-international' }, person: null }, { company: null, financial_org: { name: 'Fidelity Ventures', permalink: 'fidelity-ventures' }, person: null }, { company: null, financial_org: { name: 'Star Ventures', permalink: 'star-ventures' }, person: null }, { company: null, financial_org: { name: 'Castile Ventures', permalink: 'castile-ventures' }, person: null } ] }, { raised_amount: 25000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Boulder Ventures', permalink: 'boulder-ventures' }, person: null }, { company: null, financial_org: { name: 'Sequel Venture Partners', permalink: 'sequel' }, person: null }, { company: null, financial_org: { name: 'Sprout Group', permalink: 'the-sprout-group' }, person: null }, { company: null, financial_org: { name: 'EPIC Ventures', permalink: 'epic-ventures' }, person: null }, { company: null, financial_org: { name: 'Garage Technology Ventures', permalink: 'garage-technology-ventures' }, person: null }, { company: null, financial_org: { name: 'Pritzker Group Venture Capital', permalink: 'pritzker-group-venture-capital' }, person: null }, { company: null, financial_org: { name: 'Ironside Ventures', permalink: 'ironside-ventures' }, person: null }, { company: null, financial_org: { name: 'Valhalla Partners', permalink: 'valhalla-partners' }, person: null }, { company: null, financial_org: { name: 'Vista Ventures', permalink: 'vista-ventures' }, person: null }, { company: null, financial_org: { name: 'JPMorgan Chase & Co', permalink: 'jpmorgan-chase-co' }, person: null }, { company: null, financial_org: { name: 'DFJ Portage Ventures', permalink: 'dfj-portage-ventures' }, person: null } ] }, { raised_amount: 49500000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Versant Ventures', permalink: 'versant-ventures' }, person: null }, { company: null, financial_org: { name: 'Skyline Ventures', permalink: 'skyline-ventures' }, person: null }, { company: null, financial_org: { name: 'Three Arch Partners', permalink: 'three-arch-partners' }, person: null }, { company: null, financial_org: { name: 'Affinity Capital Management', permalink: 'affinity-capital-management' }, person: null }, { company: null, financial_org: { name: 'Alloy Ventures', permalink: 'alloy-ventures' }, person: null }, { company: null, financial_org: { name: 'Delphi Ventures', permalink: 'delphi-ventures' }, person: null }, { company: null, financial_org: { name: 'GBS Ventures', permalink: 'gbs-ventures' }, person: null }, { company: null, financial_org: { name: 'INVESCO Private Capital', permalink: 'invesco-private-capital' }, person: null }, { company: null, financial_org: { name: 'J.P. Morgan Securities Inc.', permalink: 'j-p-morgan-securities-inc' }, person: null }, { company: null, financial_org: { name: 'ONSET Ventures', permalink: 'onset-ventures' }, person: null } ] }, { raised_amount: 1400000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'Accelerator Ventures', permalink: 'accelerator-ventures' }, person: null }, { company: null, financial_org: { name: 'JAIC America', permalink: 'jaic-america' }, person: null }, { company: null, financial_org: { name: 'Pacific I&T Ventures', permalink: 'pacific-i-t-ventures' }, person: null }, { company: null, financial_org: null, person: { first_name: 'Eric', last_name: 'Di Benedetto', permalink: 'eric-di-benedetto' } }, { company: null, financial_org: { name: 'iSteps App Ventures', permalink: 'isteps-app-ventures' }, person: null }, { company: null, financial_org: null, person: { first_name: 'Ben T.', last_name: 'Smith, IV', permalink: 'ben-smith-iv' } }, { company: null, financial_org: null, person: { first_name: 'Tim', last_name: 'Stevens', permalink: 'tim-stevens' } }, { company: null, financial_org: null, person: { first_name: 'Fabrice', last_name: 'Grinda', permalink: 'fabrice-grinda' } }, { company: null, financial_org: { name: 'LaunchCapital', permalink: 'launchcapital' }, person: null } ] }, { raised_amount: 1000000, raised_currency_code: 'USD', investments: [ { company: null, financial_org: { name: 'DFJ Gotham Ventures', permalink: 'dfj-gotham-ventures' }, person: null }, { company: null, financial_org: { name: 'Metamorphic Ventures', permalink: 'metamorphic-ventures-llc' }, person: null }, { company: null, financial_org: { name: 'RRE Ventures', permalink: 'rre-ventures' }, person: null }, { company: null, financial_org: { name: 'Pilot Group', permalink: 'pilot-group' }, person: null }, { company: null, financial_org: { name: 'AOL Ventures', permalink: 'aol-ventures' }, person: null }, { company: null, financial_org: { name: 'Lerer Ventures', permalink: 'lerer-ventures' }, person: null }, { company: null, financial_org: { name: 'Bowery Capital', permalink: 'bowery-capital' }, person: null } ] } ]