配列内のオブジェクトに対して Atlas Search クエリを実行する方法
Overview
このチュートリアルでは、配列内にあるドキュメント内のフィールドまたはオブジェクトに対して Atlas Search クエリをインデックス化して実行する方法について説明します( embeddedDocuments
)。 このページには、 Atlas Search Playground で設定した、または Atlas クラスター でロード、構成、実行できる サンプル コレクション のサンプル インデックス を使用して、 サンプル クエリ を実行するための手順が記載されています。
サンプル コレクションについて
サンプル コレクションの名前はschools
で、3 つのドキュメントが含まれています。 サンプル コレクションの各ドキュメントには、学校のname
とmascot
、学校の従業員のfirst
とlast
の名前、各言語が指示するclasses
、 subject
名とgrade
レベルが含まれています。 、 、および学校の学生に対するさまざまなclubs
。
Atlas Search インデックスについて
コレクションのインデックス定義は、次の内容を示します。
パスと パスにある配列内のドキュメントは
teachers
teachers.classes
embeddedDocuments としてインデックス付けされ、ドキュメント内のフィールドは 動的に インデックス化されます。teachers
パスにある配列内のドキュメントも、 強調表示 をサポートするために ドキュメント タイプとしてインデックス付けされ、ドキュメント内のフィールドは動的にインデックス化されます。clubs
フィールドのドキュメントは、 動的マッピング が有効になっている ドキュメント タイプとしてインデックス付けされ、clubs.sports
フィールド内のドキュメントの配列は、動的マッピングが有効になっているembeddedDocuments
タイプとしてインデックス付けされます。
クエリについて
サンプル クエリは、 schools
コレクション内の埋め込みドキュメントを検索します。 クエリは、次のパイプライン ステージを使用します。
$search
コレクションを検索します。$project
を使用してコレクションのフィールドを除外し、結果にscore
という名前のフィールドを追加します。 ハイライトを有効にするクエリの場合、$project
ステージはハイライト情報を含むhighlights
という新しいフィールドも追加します。
このチュートリアルでは、3 つの異なるクエリを説明します。
このクエリは、ドキュメントのネストされた配列内のフィールドに対する検索を示します。
teachers
パスで最初の名前がJohn
の指示を検索し、 Smith
という姓の担当者を優先します。 また、 last
名前フィールドの強調表示も有効になります。
このクエリは、ドキュメント内にネストされているドキュメントの配列内のフィールドに対する検索を示します。
これは、 clubs.sports
パスでdodgeball
またはfrisbee
のいずれかを実行する機会を提供するサポートが必要な学校を検索します。
このクエリでは、ドキュメントの配列内のフィールドに対する検索と、ドキュメントの配列内にネストされたドキュメントの配列内のフィールドに対する検索が示されます。
teachers.classes
パスで12th
グレードscience
クラスを担当するクラスを検索し、そのクラスを指示する姓がSmith
のドライバーがいる学校を優先します。 また、ドキュメントのteachers
配列内にネストされたドキュメントのclasses
配列内のsubject
フィールドでも強調表示が有効になります。
Atlas Search Playground で試す
Atlas Search Playgroundでは、 埋め込みドキュメントコレクションを設定し、コレクション内のフィールドのインデックスを事前構成し、コレクションに対して実行できるクエリを定義しました。 Atlas Search Playground でコレクション、インデックス、クエリを変更することもできます。
Atlas Search Playground でこのクエリを試すには、次の操作を実行します。
Atlas Search Playground へのアクセス。
Atlas Search Playground でネストされた配列クエリの例にアクセスします。
Data Source、Index、Query ペインを確認します。
Data Sourceペインにはサンプル コレクションが含まれています。
Indexペインには、コレクションのインデックス定義が含まれています。
Queryペインにはクエリが表示されます。
Atlas Search Playground でこのクエリを試すには、次の操作を実行します。
Atlas Search Playground へのアクセス。
Atlas Search Playground で、オブジェクト サンプル クエリを使用してネストされた配列にアクセスします。
Data Source、Index、Query ペインを確認します。
Data Sourceペインにはサンプル コレクションが含まれています。
Indexペインには、コレクションのインデックス定義が含まれています。
Queryペインにはクエリが表示されます。
Atlas Search Playground でこのクエリを試すには、次の操作を実行します。
Atlas Search Playground へのアクセス。
Atlas Search Playground のサンプル配列クエリ内にネストされた配列にアクセスします。
Data Source、Index、Query ペインを確認します。
Data Sourceペインにはサンプル コレクションが含まれています。
Indexペインには、コレクションのインデックス定義が含まれています。
Queryペインにはクエリが表示されます。
Atlas クラスターで試す
このセクションでは、埋め込みドキュメントに対してクエリを実行する方法について、次の手順について説明します。
Atlas クラスターに埋め込みドキュメントを含む、
schools
という名前のサンプル コレクションを作成します。次のパスで構成されたembeddedDocumentsフィールドを含む Atlas Search インデックスを設定します。
teachers
フィールドteachers.classes
フィールドclubs.sports
フィールド
$search
複合schools
演算子と embeddedDocument 演算子、および テキスト 演算子を使用して、 コレクション内の埋め込みドキュメントを検索する クエリを実行します。カウントを取得するには、埋め込みドキュメント フィールドに対して
$searchMeta
クエリを実行します。
開始する前に、Atlas クラスターが前提条件に記載されている要件を満たしていることを確認してください。 このチュートリアルでは、新しいコレクションを作成し、このチュートリアルでクエリを実行するために必要なドキュメントをロードするため、サンプル データをアップロードする必要はありません。
サンプル コレクションの作成とデータのロード
最初に、Atlas クラスター上の既存または新規のデータベースにschools
という名前のコレクションを作成する必要があります。 コレクションを作成したら、サンプル データをコレクションにアップロードする必要があります。 サンプル コレクション内のドキュメントの詳細については、「 サンプル コレクションについて 」を参照してください。
このセクションの手順では、新しいデータベースとコレクションの作成、サンプル データをコレクションにロードする手順を説明します。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
Collections ページに移動します。
クラスターの [Browse Collections] ボタンをクリックします。
Data Explorerが表示されます。
次のドキュメントを コレクションにロードします。
schools
コレクションが未選択の場合、選択します。コレクションに追加するサンプル ドキュメントごとにInsert Documentをクリックします。
デフォルトのドキュメントを置換するには、 JSONビュー( {} )をクリックします。
次のサンプル ドキュメントを一度に 1 つずつコピーして貼り付け、 Insertをクリックしてドキュメントを 1 つずつ コレクションに追加します。
{ "_id": 0, "name": "Springfield High", "mascot": "Pumas", "teachers": [{ "first": "Jane", "last": "Smith", "classes": [{ "subject": "art of science", "grade": "12th" }, { "subject": "applied science and practical science", "grade": "9th" }, { "subject": "remedial math", "grade": "12th" }, { "subject": "science", "grade": "10th" }] }, { "first": "Bob", "last": "Green", "classes": [{ "subject": "science of art", "grade": "11th" }, { "subject": "art art art", "grade": "10th" }] }], "clubs": { "stem": [ { "club_name": "chess", "description": "provides students opportunity to play the board game of chess informally and competitively in tournaments." }, { "club_name": "kaboom chemistry", "description": "provides students opportunity to experiment with chemistry that fizzes and explodes." } ], "arts": [ { "club_name": "anime", "description": "provides students an opportunity to discuss, show, and collaborate on anime and broaden their Japanese cultural understanding." }, { "club_name": "visual arts", "description": "provides students an opportunity to train, experiment, and prepare for internships and jobs as photographers, illustrators, graphic designers, and more." } ] } } { "_id": 1, "name": "Evergreen High", "mascot": "Jaguars", "teachers": [{ "first": "Jane", "last": "Earwhacker", "classes": [{ "subject": "art", "grade": "9th" }, { "subject": "science", "grade": "12th" }] }, { "first": "John", "last": "Smith", "classes": [{ "subject": "math", "grade": "12th" }, { "subject": "art", "grade": "10th" }] }], "clubs": { "sports": [ { "club_name": "archery", "description": "provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment." }, { "club_name": "ultimate frisbee", "description": "provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes." } ], "stem": [ { "club_name": "zapped", "description": "provides students an opportunity to make exciting gadgets and explore electricity." }, { "club_name": "loose in the chem lab", "description": "provides students an opportunity to put the scientific method to the test and get elbow deep in chemistry." } ] } } { "_id": 2, "name": "Lincoln High", "mascot": "Sharks", "teachers": [{ "first": "Jane", "last": "Smith", "classes": [{ "subject": "science", "grade": "9th" }, { "subject": "math", "grade": "12th" }] }, { "first": "John", "last": "Redman", "classes": [{ "subject": "art", "grade": "12th" }] }], "clubs": { "arts": [ { "club_name": "ceramics", "description": "provides students an opportunity to acquire knowledge of form, volume, and space relationships by constructing hand-built and wheel-thrown forms of clay." }, { "club_name": "digital art", "description": "provides students an opportunity to learn about design for entertainment, 3D animation, technical art, or 3D modeling." } ], "sports": [ { "club_name": "dodgeball", "description": "provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves." }, { "club_name": "martial arts", "description": "provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons." } ] } }
Atlas Search インデックスの作成
このセクションでは、 local_school_district.schools
コレクション内の埋め込みドキュメントのフィールド用に Atlas Search インデックスを作成します。
必要なアクセス権
Atlas Search インデックスを作成するには、プロジェクトに対するProject Data Access Admin
以上のアクセス権が必要です。
手順
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
Index Name を入力し、Database and Collection を設定します。
Index Nameフィールドに
embedded-documents-tutorial
と入力します。インデックスに
default
と名付けると、 $searchパイプライン ステージでindex
パラメータを指定する必要がなくなります。 インデックスにカスタム名を付ける場合は、index
パラメータでこの名前を指定する必要があります。Database and Collectionセクションで、
local_school_district
データベースを検索し、schools
コレクションを選択します。
埋め込みドキュメントにインデックスを作成するインデックス構成を指定します。
インデックス定義の詳細については、「 Atlas Search インデックスについて 」を参照してください。
[Next] をクリックします。
[Refine Your Index] をクリックします。
Field MappingsセクションでAdd Fieldをクリックし、 Add Field Mappingウィンドウで各フィールドの設定を 1 つずつ順番に構成した後Addをクリックして、 Customized Configurationタブに次のフィールドを追加します。
Field NameData TypeEnable Dynamic Mappingteachers
EmbeddedDocuments
On
teachers.classes
EmbeddedDocuments
On
teachers
Document
On
teachers.classes
Document
On
teachers.classes.grade
StringFacet
該当なし
clubs.sports
EmbeddedDocuments
On
Add Field MappingsをクリックするとAdd Field Mappingウィンドウが開きます。
ドロップダウンから以下を選択します。
Add Field MappingsをクリックするとAdd Field Mappingウィンドウが開きます。
ドロップダウンから以下を選択します。
Enable Dynamic Mappingがまだ有効になっていない場合は を有効に切り替え、 Addをクリックします
[Save] をクリックします。
[Save Changes] をクリックします。
デフォルトのインデックス定義を、以下のインデックス定義で置き換えます。
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "clubs": { 6 "dynamic": true, 7 "fields": { 8 "sports": { 9 "dynamic": true, 10 "type": "embeddedDocuments" 11 } 12 }, 13 "type": "document" 14 }, 15 "teachers": [ 16 { 17 "dynamic": true, 18 "fields": { 19 "classes": { 20 "dynamic": true, 21 "type": "embeddedDocuments" 22 } 23 }, 24 "type": "embeddedDocuments" 25 }, 26 { 27 "dynamic": true, 28 "fields": { 29 "classes": { 30 "dynamic": true, 31 "fields": { 32 "grade": { 33 "type": "stringFacet" 34 } 35 }, 36 "type": "document" 37 } 38 }, 39 "type": "document" 40 } 41 ] 42 } 43 } 44 } [Next] をクリックします。
埋め込みドキュメント フィールドに対して $search
クエリを実行
埋め込みドキュメント フィールドに対してクエリを実行できます。 このチュートリアルでは、クエリの 複合 演算子 内で embeddedDocument 演算子と テキスト 演算子を使用します。
このセクションでは、Atlas クラスターに接続し、 schools
コレクションのフィールドに対して演算子を使用してサンプル クエリを実行します。
➤ このページの [言語の選択] ドロップダウンメニューを使用して、このセクションの例の言語を設定します。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
schools
コレクションに対して embeddedDocument
演算子を使用して AtlasSearch クエリを実行します。
次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorのSearchボタンをクリックします。
注意
Search Testerは の強調表示をサポートしていません。 したがって、結果内に 強調表示さ れる情報を表示するには、mongosh
または MongoDB ドライバーを使用します。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 [ 2 { 3 "$search": { 4 "index": "embedded-documents-tutorial", 5 "embeddedDocument": { 6 "path": "teachers", 7 "operator": { 8 "compound": { 9 "must": [{ 10 "text": { 11 "path": "teachers.first", 12 "query": "John" 13 } 14 }], 15 "should":[{ 16 "text": { 17 "path": "teachers.last", 18 "query": "Smith" 19 } 20 }] 21 } 22 } 23 } 24 } 25 } 26 ]
SCORE: 0.7830756902694702 _id: "1" name: "Evergreen High" mascot: "Jaguars" teachers: Array 0: Object first: "Jane" last: "Earwhacker" classes: Array ... 1: Object first: "John" last: "Smith" classes: Array ... clubs: Object ... SCORE: 0.468008816242218 _id: "2" name: "Lincoln High" mascot: "Sharks" teachers: Array 0: Object first: "Jane" last: "Smith" classes: Array ... 1: Object first: "John" last: "Redman" classes: Array ... clubs: Object ...
このクエリの詳細については、「 クエリについて 」を参照してください。
1 [ 2 { 3 "$search": { 4 "index": "embedded-documents-tutorial", 5 "embeddedDocument": { 6 "path": "clubs.sports", 7 "operator": { 8 "queryString": { 9 "defaultPath": "clubs.sports.club_name", 10 "query": "dodgeball OR frisbee" 11 } 12 } 13 } 14 } 15 } 16 ]
score: 0.633669912815094 _id: 2 name: "Lincoln High" mascot: "Sharks" teachers: Array ... clubs: Object sports: Array (2) 0: Object club_name: "dodgeball" description: "provides students an opportunity to play dodgeball by throwing balls t…" 1: Object club_name: "martial arts" description: "provides students an opportunity to learn self-defense or combat that …" stem: Array (2) ... score: 0.481589138507843 _id: 1 name: "Evergreen High" mascot: "Jaguars" teachers: Array ... clubs: Object sports: Array (2) 0: Object club_name: "archery" description: "provides students an opportunity to practice and hone the skill of usi…" 1: Object club_name: "ultimate frisbee" description: "provides students an opportunity to play frisbee and learn the basics …" stem: Array (2) ...
このクエリの詳細については、「 クエリについて 」を参照してください。
[ { $search: { index: "embedded-documents-tutorial", "embeddedDocument": { "path": "teachers", "operator": { "compound": { "must": [{ "embeddedDocument": { "path": "teachers.classes", "operator": { "compound": { "must": [{ "text": { "path": "teachers.classes.grade", "query": "12th" } }, { "text": { "path": "teachers.classes.subject", "query": "science" } }] } } } }], "should": [{ "text": { "path": "teachers.last", "query": "smith" } }] } } } } } ]
SCORE: 0.9415585994720459 name: "Springfield High" mascot: "Pumas" teachers: Array 0: Object first: "Jane" last: "Smith" classes: Array 0: Object subject: "art of science" grade: "12th" 1: Object subject: "applied science and practical science" grade: "9th" 2: Object subject: "remedial math" grade: "12th" 3: Object subject: "science" grade: "10th" 1: Object first: "Bob" last: "Green" classes: Array 0: Object subject: "science of art" grade: "11th" 1: Object subject: "art art art" grade: "10th" clubs: Object ... SCORE: 0.7779859304428101 _id: "1" name: "Evergreen High" mascot: "Jaguars" teachers: Array 0: Object first: "Jane" last: "Earwhacker" classes: Array 0: Object subject: "art" grade: "9th" 1: Object subject: "science" grade: "12th" 1: Object first: "John" last: "Smith" classes: Array 0: Object subject: "math" grade: "12th" 1: Object subject: "art" grade: "10th" clubs: Object ...
mongosh
を使用してクラスターに接続します。
ターミナル ウィンドウでmongosh
を開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh
経由での接続 」を参照してください。
local_school
データベースを使用します。
mongosh
プロンプトで次のコマンドを実行します。
use local_school_district
switched to db local_school_district
schools
コレクションに対して、以下のAtlas Searchクエリを実行します。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 db.schools.aggregate({ 2 "$search": { 3 "index": "embedded-documents-tutorial", 4 "embeddedDocument": { 5 "path": "teachers", 6 "operator": { 7 "compound": { 8 "must": [{ 9 "text": { 10 "path": "teachers.first", 11 "query": "John" 12 } 13 }], 14 "should":[{ 15 "text": { 16 "path": "teachers.last", 17 "query": "Smith" 18 } 19 }] 20 } 21 } 22 }, 23 "highlight": { 24 "path": "teachers.last" 25 } 26 } 27 }, 28 { 29 "$project": { 30 "_id": 1, 31 "teachers": 1, 32 "score": { $meta: "searchScore" }, 33 "highlights": { "$meta": "searchHighlights" } 34 } 35 })
1 [ 2 { 3 _id: 1, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Earwhacker', 8 classes: [ 9 { subject: 'art', grade: '9th' }, 10 { subject: 'science', grade: '12th' } 11 ] 12 }, 13 { 14 first: 'John', 15 last: 'Smith', 16 classes: [ 17 { subject: 'math', grade: '12th' }, 18 { subject: 'art', grade: '10th' } 19 ] 20 } 21 ], 22 score: 0.7830756902694702, 23 highlights: [ 24 { 25 score: 1.4921371936798096, 26 path: 'teachers.last', 27 texts: [ { value: 'Smith', type: 'hit' } ] 28 } 29 ] 30 }, 31 { 32 _id: 2, 33 teachers: [ 34 { 35 first: 'Jane', 36 last: 'Smith', 37 classes: [ 38 { subject: 'science', grade: '9th' }, 39 { subject: 'math', grade: '12th' } 40 ] 41 }, 42 { 43 first: 'John', 44 last: 'Redman', 45 classes: [ { subject: 'art', grade: '12th' } ] 46 } 47 ], 48 score: 0.468008816242218, 49 highlights: [ 50 { 51 score: 1.4702850580215454, 52 path: 'teachers.last', 53 texts: [ { value: 'Smith', type: 'hit' } ] 54 } 55 ] 56 } 57 ]
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 db.schools.aggregate( 2 { 3 "$search": { 4 "index": "embedded-documents-tutorial", 5 "embeddedDocument": { 6 "path": "clubs.sports", 7 "operator": { 8 "queryString": { 9 "defaultPath": "clubs.sports.club_name", 10 "query": "dodgeball OR frisbee" 11 } 12 } 13 } 14 } 15 }, 16 { 17 "$project": { 18 "_id": 1, 19 "name": 1, 20 "clubs.sports": 1, 21 "score": { $meta: "searchScore" } 22 } 23 } 24 )
1 [ 2 { 3 _id: 2, 4 name: 'Lincoln High', 5 clubs: { 6 sports: [ 7 { 8 club_name: 'dodgeball', 9 description: 'provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.' 10 }, 11 { 12 club_name: 'martial arts', 13 description: 'provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.' 14 } 15 ] 16 }, 17 score: 0.633669912815094 18 }, 19 { 20 _id: 1, 21 name: 'Evergreen High', 22 clubs: { 23 sports: [ 24 { 25 club_name: 'archery', 26 description: 'provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.' 27 }, 28 { 29 club_name: 'ultimate frisbee', 30 description: 'provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.' 31 } 32 ] 33 }, 34 score: 0.481589138507843 35 } 36 ]
結果の 2 つのドキュメントは、学生がdodgeball
またはfrisbee
をプレイできるチームを提供する学校を示しています。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 db.schools.aggregate({ 2 "$search": { 3 "index": "embedded-documents-tutorial", 4 "embeddedDocument": { 5 "path": "teachers", 6 "operator": { 7 "compound": { 8 "must": [{ 9 "embeddedDocument": { 10 "path": "teachers.classes", 11 "operator": { 12 "compound": { 13 "must": [{ 14 "text": { 15 "path": "teachers.classes.grade", 16 "query": "12th" 17 } 18 }, 19 { 20 "text": { 21 "path": "teachers.classes.subject", 22 "query": "science" 23 } 24 }] 25 } 26 } 27 } 28 }], 29 "should": [{ 30 "text": { 31 "path": "teachers.last", 32 "query": "smith" 33 } 34 }] 35 } 36 } 37 }, 38 "highlight": { 39 "path": "teachers.classes.subject" 40 } 41 } 42 }, 43 { 44 "$project": { 45 "_id": 1, 46 "teachers": 1, 47 "score": { $meta: "searchScore" }, 48 "highlights": { "$meta": "searchHighlights" } 49 } 50 })
1 [ 2 { 3 _id: 0, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Smith', 8 classes: [ 9 { subject: 'art of science', grade: '12th' }, 10 { 11 subject: 'applied science and practical science', 12 grade: '9th' 13 }, 14 { subject: 'remedial math', grade: '12th' }, 15 { subject: 'science', grade: '10th' } 16 ] 17 }, 18 { 19 first: 'Bob', 20 last: 'Green', 21 classes: [ 22 { subject: 'science of art', grade: '11th' }, 23 { subject: 'art art art', grade: '10th' } 24 ] 25 } 26 ], 27 score: 0.9415585994720459, 28 highlights: [ 29 { 30 score: 0.7354040145874023, 31 path: 'teachers.classes.subject', 32 texts: [ 33 { value: 'art of ', type: 'text' }, 34 { value: 'science', type: 'hit' } 35 ] 36 }, 37 { 38 score: 0.7871346473693848, 39 path: 'teachers.classes.subject', 40 texts: [ 41 { value: 'applied ', type: 'text' }, 42 { value: 'science', type: 'hit' }, 43 { value: ' and practical ', type: 'text' }, 44 { value: 'science', type: 'hit' } 45 ] 46 }, 47 { 48 score: 0.7581484317779541, 49 path: 'teachers.classes.subject', 50 texts: [ { value: 'science', type: 'hit' } ] 51 }, 52 { 53 score: 0.7189631462097168, 54 path: 'teachers.classes.subject', 55 texts: [ 56 { value: 'science', type: 'hit' }, 57 { value: ' of art', type: 'text' } 58 ] 59 } 60 ] 61 }, 62 { 63 _id: 1, 64 teachers: [ 65 { 66 first: 'Jane', 67 last: 'Earwhacker', 68 classes: [ 69 { subject: 'art', grade: '9th' }, 70 { subject: 'science', grade: '12th' } 71 ] 72 }, 73 { 74 first: 'John', 75 last: 'Smith', 76 classes: [ 77 { subject: 'math', grade: '12th' }, 78 { subject: 'art', grade: '10th' } 79 ] 80 } 81 ], 82 score: 0.7779859304428101, 83 highlights: [ 84 { 85 score: 1.502043604850769, 86 path: 'teachers.classes.subject', 87 texts: [ { value: 'science', type: 'hit' } ] 88 } 89 ] 90 } 91 ]
結果の 2 つのドキュメントには、 12th
グレードscience
を学ぶ生徒が含まれています。 _id: 0
を含むドキュメントには、姓がSmith
の生徒が含まれており、 12th
はscience
を指示しています。
MongoDB Compass のクラスターに接続します。
MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。
schools
コレクションに対して、以下のAtlas Searchクエリを実行します。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
パイプラインステージ | クエリ | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||
|
Auto Previewを有効にした場合、MongoDB Compass は次のドキュメントを |
1 [ 2 { 3 _id: 1, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Earwhacker', 8 classes: [ 9 { subject: 'art', grade: '9th' }, 10 { subject: 'science', grade: '12th' } 11 ] 12 }, 13 { 14 first: 'John', 15 last: 'Smith', 16 classes: [ 17 { subject: 'math', grade: '12th' }, 18 { subject: 'art', grade: '10th' } 19 ] 20 } 21 ], 22 score: 0.7830756902694702, 23 highlights: [ 24 { 25 score: 1.4921371936798096, 26 path: 'teachers.last', 27 texts: [ { value: 'Smith', type: 'hit' } ] 28 } 29 ] 30 }, 31 { 32 _id: 2, 33 teachers: [ 34 { 35 first: 'Jane', 36 last: 'Smith', 37 classes: [ 38 { subject: 'science', grade: '9th' }, 39 { subject: 'math', grade: '12th' } 40 ] 41 }, 42 { 43 first: 'John', 44 last: 'Redman', 45 classes: [ { subject: 'art', grade: '12th' } ] 46 } 47 ], 48 score: 0.468008816242218, 49 highlights: [ 50 { 51 score: 1.4702850580215454, 52 path: 'teachers.last', 53 texts: [ { value: 'Smith', type: 'hit' } ] 54 } 55 ] 56 } 57 ]
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
このクエリの詳細については、「 クエリについて 」を参照してください。
パイプラインステージ | クエリ | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||
|
Auto Previewを有効にした場合、MongoDB Compass は次のドキュメントを |
1 [ 2 { 3 _id: 2, 4 name: 'Lincoln High', 5 clubs: { 6 sports: [ 7 { 8 club_name: 'dodgeball', 9 description: 'provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.' 10 }, 11 { 12 club_name: 'martial arts', 13 description: 'provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.' 14 } 15 ] 16 }, 17 score: 0.633669912815094 18 }, 19 { 20 _id: 1, 21 name: 'Evergreen High', 22 clubs: { 23 sports: [ 24 { 25 club_name: 'archery', 26 description: 'provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.' 27 }, 28 { 29 club_name: 'ultimate frisbee', 30 description: 'provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.' 31 } 32 ] 33 }, 34 score: 0.481589138507843 35 } 36 ]
結果の 2 つのドキュメントは、学生がdodgeball
またはfrisbee
をプレイできるチームを提供する学校を示しています。
このクエリの詳細については、「 クエリについて 」を参照してください。
パイプラインステージ | クエリ | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||||||||||||||||||||||||||||||
|
Auto Previewを有効にした場合、MongoDB Compass は次のドキュメントを |
1 [ 2 { 3 _id: 0, 4 teachers: [ 5 { 6 first: 'Jane', 7 last: 'Smith', 8 classes: [ 9 { subject: 'art of science', grade: '12th' }, 10 { 11 subject: 'applied science and practical science', 12 grade: '9th' 13 }, 14 { subject: 'remedial math', grade: '12th' }, 15 { subject: 'science', grade: '10th' } 16 ] 17 }, 18 { 19 first: 'Bob', 20 last: 'Green', 21 classes: [ 22 { subject: 'science of art', grade: '11th' }, 23 { subject: 'art art art', grade: '10th' } 24 ] 25 } 26 ], 27 score: 0.9415585994720459, 28 highlights: [ 29 { 30 score: 0.7354040145874023, 31 path: 'teachers.classes.subject', 32 texts: [ 33 { value: 'art of ', type: 'text' }, 34 { value: 'science', type: 'hit' } 35 ] 36 }, 37 { 38 score: 0.7871346473693848, 39 path: 'teachers.classes.subject', 40 texts: [ 41 { value: 'applied ', type: 'text' }, 42 { value: 'science', type: 'hit' }, 43 { value: ' and practical ', type: 'text' }, 44 { value: 'science', type: 'hit' } 45 ] 46 }, 47 { 48 score: 0.7581484317779541, 49 path: 'teachers.classes.subject', 50 texts: [ { value: 'science', type: 'hit' } ] 51 }, 52 { 53 score: 0.7189631462097168, 54 path: 'teachers.classes.subject', 55 texts: [ 56 { value: 'science', type: 'hit' }, 57 { value: ' of art', type: 'text' } 58 ] 59 } 60 ] 61 }, 62 { 63 _id: 1, 64 teachers: [ 65 { 66 first: 'Jane', 67 last: 'Earwhacker', 68 classes: [ 69 { subject: 'art', grade: '9th' }, 70 { subject: 'science', grade: '12th' } 71 ] 72 }, 73 { 74 first: 'John', 75 last: 'Smith', 76 classes: [ 77 { subject: 'math', grade: '12th' }, 78 { subject: 'art', grade: '10th' } 79 ] 80 } 81 ], 82 score: 0.7779859304428101, 83 highlights: [ 84 { 85 score: 1.502043604850769, 86 path: 'teachers.classes.subject', 87 texts: [ { value: 'science', type: 'hit' } ] 88 } 89 ] 90 } 91 ]
結果の 2 つのドキュメントには、 12th
グレードscience
を学ぶ生徒が含まれています。 _id: 0
を含むドキュメントには、姓がSmith
の生徒が含まれており、 12th
はscience
を指示しています。
クエリをコピーして Program.cs
ファイルに貼り付けます。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class NestedArrayExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our SchoolDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var districtSchoolsDatabase = mongoClient.GetDatabase("local_school_district"); 20 var schoolsCollection = districtSchoolsDatabase.GetCollection<SchoolDocument>("schools"); 21 22 // define variables for query 23 var compoundQuery = Builders<TeacherDocument>.Search.Compound() 24 .Must(Builders<TeacherDocument>.Search.Text(teacher => teacher.First, "John")) 25 .Should(Builders<TeacherDocument>.Search.Text(teacher => teacher.Last, "Smith")); 26 var opts = new SearchHighlightOptions<SchoolDocument>(school => school.Teachers.Select(teacher => teacher.Last));; 27 28 // define and run pipeline 29 var results = schoolsCollection.Aggregate() 30 .Search(Builders<SchoolDocument>.Search.EmbeddedDocument( 31 school => school.Teachers, compoundQuery), opts, 32 indexName: "embedded-documents-tutorial" 33 ) 34 .Project<SchoolDocument>(Builders<SchoolDocument>.Projection 35 .Include(school => school.Name) 36 .Include(school => school.Mascot) 37 .Include(school => school.Teachers) 38 .MetaSearchScore(school => school.Score) 39 .MetaSearchHighlights("highlights")) 40 .ToList(); 41 42 // print results 43 foreach (var school in results) 44 { 45 Console.WriteLine(school.ToJson()); 46 } 47 } 48 } 49 50 [ ]51 public class SchoolDocument 52 { 53 public int Id { get; set; } 54 public string Name { get; set; } 55 public string Mascot { get; set; } 56 public TeacherDocument[] Teachers { get; set; } 57 [ ]58 public List<SearchHighlight> Highlights { get; set; } 59 public double Score { get; set; } 60 } 61 62 [ ]63 public class TeacherDocument 64 { 65 public string First { get; set; } 66 public string Last { get; set; } 67 public ClassDocument[] Classes { get; set; } 68 } 69 70 [ ]71 public class ClassDocument 72 { 73 public string Subject { get; set; } 74 public string Grade { get; set; } 75 }
このクエリの詳細については、「 クエリについて 」を参照してください。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 using System; 7 using System.Collections.Generic; 8 using System.Reflection.Emit; 9 10 public class NestedArrayWithinObjectExample 11 { 12 private const string MongoConnectionString = "<connection-string>"; 13 14 public static void Main(string[] args) 15 { 16 // allow automapping of the camelCase database fields to our SchoolDocument 17 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 18 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 19 20 // connect to your Atlas cluster 21 var mongoClient = new MongoClient(MongoConnectionString); 22 var districtSchoolsDatabase = mongoClient.GetDatabase("local_school_district"); 23 var schoolsCollection = districtSchoolsDatabase.GetCollection<SchoolDocument>("schools"); 24 25 // define variables for query 26 var queryStringQuery = Builders<ExtraCurricularDocument>.Search.QueryString( 27 sport => sport.ClubName, "dodgeball OR frisbee" 28 ); 29 30 // define and run pipeline 31 var results = schoolsCollection.Aggregate() 32 .Search(Builders<SchoolDocument>.Search.EmbeddedDocument( 33 school => school.Clubs.Sports, queryStringQuery), 34 indexName: "embedded-documents-tutorial" 35 ) 36 .Project<SchoolDocument>(Builders<SchoolDocument>.Projection 37 .Include(school => school.Clubs) 38 .Include(school => school.Name) 39 .Include(school => school.Id) 40 .MetaSearchScore(school => school.Score)) 41 .ToList(); 42 43 // print results 44 foreach (var school in results) 45 { 46 Console.WriteLine(school.ToJson()); 47 } 48 } 49 } 50 51 [ ]52 public class SchoolDocument 53 { 54 public int Id { get; set; } 55 public string Name { get; set; } 56 public ClubDocument Clubs { get; set; } 57 public double Score { get; set; } 58 } 59 60 [ ]61 public class ClubDocument 62 { 63 public ExtraCurricularDocument[] Sports { get; set; } 64 } 65 66 [ ]67 public class ExtraCurricularDocument 68 { 69 [ ]70 public string ClubName { get; set; } 71 public string Description { get; set; } 72 }
このクエリの詳細については、「 クエリについて 」を参照してください。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class NestedArrayWithinArrayExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our SchoolDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var districtSchoolsDatabase = mongoClient.GetDatabase("local_school_district"); 20 var schoolsCollection = districtSchoolsDatabase.GetCollection<SchoolDocument>("schools"); 21 22 // define variables for query 23 var mustQuery = Builders<ClassDocument>.Search.Compound() 24 .Must(Builders<ClassDocument>.Search.Text(classes => classes.Grade, "12th"), Builders<ClassDocument>.Search.Text(classes => classes.Subject, "science")); 25 var compoundQuery = Builders<TeacherDocument>.Search.Compound() 26 .Must(Builders<TeacherDocument>.Search.EmbeddedDocument(teacher => teacher.Classes, mustQuery)) 27 .Should(Builders<TeacherDocument>.Search.Text(teacher => teacher.Last, "smith")); 28 var opts = new SearchHighlightOptions<SchoolDocument>("teachers.classes.subject"); 29 30 // define and run pipeline 31 var results = schoolsCollection.Aggregate() 32 .Search(Builders<SchoolDocument>.Search.EmbeddedDocument( 33 school => school.Teachers, compoundQuery), opts, 34 indexName: "embedded-documents-tutorial" 35 ) 36 .Project<SchoolDocument>(Builders<SchoolDocument>.Projection 37 .Include(school => school.Teachers) 38 .MetaSearchScore(school => school.Score) 39 .MetaSearchHighlights("highlights")) 40 .ToList(); 41 42 // print results 43 foreach (var school in results) 44 { 45 Console.WriteLine(school.ToJson()); 46 } 47 } 48 } 49 50 [ ]51 public class SchoolDocument 52 { 53 public int Id { get; set; } 54 public TeacherDocument[] Teachers { get; set; } 55 [ ]56 public List<SearchHighlight> Highlights { get; set; } 57 public double Score { get; set; } 58 } 59 60 [ ]61 public class TeacherDocument 62 { 63 public string First { get; set; } 64 public string Last { get; set; } 65 public ClassDocument[] Classes { get; set; } 66 } 67 68 [ ]69 public class ClassDocument 70 { 71 public string Subject { get; set; } 72 public string Grade { get; set; } 73 }
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
Program.cs
ファイルをコンパイルして実行します。
dotnet run embedded-documents-query.csproj
{ "_id" : 1, "name" : "Evergreen High", "mascot" : "Jaguars", "teachers" : [{ "first" : "Jane", "last" : "Earwhacker", "classes" : [{ " subject" : "art", "grade" : "9th" }, { "subject" : "science", "grade" : "12th" }] }, { "first" : "John", "last" : "Smith", "classes" : [{ "subject" : "math", "grade" : "12th" }, { "subject" : "art", "grade" : "10th" }] }], "highlights" : [{ "path" : "teachers.last", "score" : 1.4921371936798096, "texts" : [{ "type" : "Hit", "value" : "Smith" }] }], "score" : 0.78307569026947021 } { "_id" : 2, "name" : "Lincoln High", "mascot" : "Sharks", "teachers" : [{ "first" : "Jane", "last" : "Smith", "classes" : [{ "subject" : "science", "grade" : "9th" }, { "subject" : "math", "grade" : "12th" }] }, { "first" : "John", "last" : "Redman", "classes" : [{ "subject" : "art", "grade" : "12th" }] }], "highlights" : [{ "path" : "teachers.last", "score" : 1.4702850580215454, "texts" : [{ "type" : "Hit", "value" : "Smith" }] }], "score" : 0.46800881624221802 }
dotnet run embedded-documents-query.csproj
{ "_id" : 2, "name" : "Lincoln High", "clubs" : { "sports" : [{ "club_name" : "dodgeball", "description" : "provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves." }, { "club_name" : "martial arts", "description" : "provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons." }] }, "score" : 0.63366991281509399 } { "_id" : 1, "name" : "Evergreen High", "clubs" : { "sports" : [{ "club_name" : "archery", "description" : "provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment." }, { "club_name" : "ultimate frisbee", "description" : "provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes." }] }, "score" : 0.48158913850784302 }
dotnet run embedded-documents-query.csproj
{ "_id" : 0, "teachers" : [{ "first" : "Jane", "last" : "Smith", "classes" : [{ "subject" : "art of science", "grade" : "12th" }, { "subject" : "applied science and practical science", "grade" : "9th" }, { "subject" : "remedial math", "grade" : "12th" }, { "subject" : "science", "grade" : "10th" }] }, { "first" : "Bob", "last" : "Green", "classes" : [{ "subject" : "science of art", "grade" : "11th" }, { "subject" : "art art art", "grade" : "10th" }] }], "highlights" : [{ "path" : "teachers.classes.subject", "score" : 0.73540401458740234, "texts" : [ { "type" : "Text", "value" : "art of " }, { "type" : "Hit", "value" : "science" } ] }, { "path" : "teachers.classes.subject", "score" : 0.78713464736938477, "texts" : [ { "type" : "Text", "value" : "applied " }, { "type" : "Hit", "value" : "science" }, { "type" : "Text", "value" : " and practical " }, { "type" : "Hit", "value" : "science" }] }, { "path" : "teachers.classes.subject", "score" : 0.7581484317779541, "texts" : [{ "type" : "Hit", "value" : "science" }] }, { "path" : "teachers.classes.subject", "score" : 0.7189631462097168, "texts" : [ { "type" : "Hit", "value" : "science" }, { "type" : "Text", "value" : " of art" } ] }], "score" : 0.9415585994720459 } { "_id" : 1, "teachers" : [{ "first" : "Jane", "last" : "Earwhacker", "classes" : [{ "subject" : "art", "grade" : "9th" }, { "subject" : "science", "grade" : "12th" }] }, { "first" : "John", "last" : "Smith", "classes" : [{ "subject" : "math", "grade" : "12th" }, { "subject" : "art", "grade" : "10th" }] }], "highlights" : [{ "path" : "teachers.classes.subject", "score" : 1.502043604850769, "texts" : [{ "type" : "Hit", "value" : "science" }] }], "score" : 0.77798593044281006 }
クエリのコード例をコピーしてそれぞれのファイルに貼り付けます。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.M{ 27 "path": "teachers", "operator": bson.M{ 28 "compound": bson.M{ 29 "must": bson.A{ 30 bson.M{ 31 "text": bson.D{ 32 {"path", "teachers.first"}, 33 {"query", "John"}, 34 }, 35 }, 36 }, 37 "should": bson.A{ 38 bson.M{ 39 "text": bson.D{ 40 {"path", "teachers.last"}, 41 {"query", "Smith"}, 42 }, 43 }, 44 }, 45 }, 46 }, 47 }, 48 "highlight": bson.D{{"path", "teachers.last"}}, 49 }}} 50 51 projectStage := bson.D{{"$project", bson.D{{"teachers", 1}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}} 52 53 // run pipeline 54 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 55 if err != nil { 56 panic(err) 57 } 58 59 // print results 60 var results []bson.D 61 if err = cursor.All(context.TODO(), &results); err != nil { 62 panic(err) 63 } 64 for _, result := range results { 65 fmt.Println(result) 66 } 67 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.D{ 27 {"path", "clubs.sports"}, 28 {"operator", 29 bson.D{ 30 {"queryString", 31 bson.D{ 32 {"defaultPath", "clubs.sports.club_name"}, 33 {"query", "dodgeball OR frisbee"}, 34 }, 35 }, 36 }, 37 }, 38 }, 39 }}} 40 41 projectStage := bson.D{{"$project", bson.D{{"name", 1}, {"clubs.sports", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 42 43 // run pipeline 44 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 45 if err != nil { 46 panic(err) 47 } 48 49 // print results 50 var results []bson.D 51 if err = cursor.All(context.TODO(), &results); err != nil { 52 panic(err) 53 } 54 for _, result := range results { 55 fmt.Println(result) 56 } 57 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.M{ 27 "path": "teachers", 28 "operator": bson.M{ 29 "compound": bson.M{ 30 "must": bson.A{ 31 bson.M{ 32 "embeddedDocument": bson.M{ 33 "path": "teachers.classes", 34 "operator": bson.M{ 35 "compound": bson.M{ 36 "must": bson.A{ 37 bson.M{ 38 "text": bson.D{ 39 {"path", "teachers.classes.grade"}, 40 {"query", "12th"}, 41 }, 42 }, 43 bson.M{ 44 "text": bson.D{ 45 {"path", "teachers.classes.subject"}, 46 {"query", "science"}, 47 }, 48 }, 49 }, 50 }, 51 }, 52 }, 53 }, 54 }, 55 "should": bson.A{ 56 bson.M{ 57 "text": bson.D{ 58 {"path", "teachers.last"}, 59 {"query", "Smith"}, 60 }, 61 }, 62 }, 63 }, 64 }, 65 }, 66 "highlight": bson.D{{"path", "teachers.classes.subject"}}, 67 }}} 68 69 projectStage := bson.D{{"$project", bson.D{{"teachers", 1}, {"score", bson.D{{"$meta", "searchScore"}}}, {"highlights", bson.D{{"$meta", "searchHighlights"}}}}}} 70 71 // run pipeline 72 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 73 if err != nil { 74 panic(err) 75 } 76 77 // print results 78 var results []bson.D 79 if err = cursor.All(context.TODO(), &results); err != nil { 80 panic(err) 81 } 82 for _, result := range results { 83 fmt.Println(result) 84 } 85 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
次のコマンドを実行して、コレクションをクエリします。
go run basic-embedded-documents-search.go
1 [ 2 {_id 1} 3 {teachers [[ 4 {first Jane} 5 {last Earwhacker} 6 {classes [[{subject art} {grade 9th}] [{subject science} {grade 12th}]]} 7 ] [ 8 {first John} 9 {last Smith} 10 {classes [[{subject math} {grade 12th}] [{subject art} {grade 10th}]]} 11 ]]} 12 {score 0.7830756902694702} 13 {highlights [[ 14 {score 1.4921371936798096} 15 {path teachers.last} 16 {texts [[{value Smith} {type hit}]]} 17 ]]} 18 ] 19 [ 20 {_id 2} 21 {teachers [[ 22 {first Jane} 23 {last Smith} 24 {classes [[{subject science} {grade 9th}] [{subject math} {grade 12th}]]} 25 ] [ 26 {first John} 27 {last Redman} 28 {classes [[{subject art} {grade 12th}]]} 29 ]]} 30 {score 0.468008816242218} 31 {highlights [[ 32 {score 1.4702850580215454} 33 {path teachers.last} 34 {texts [[{value Smith} {type hit}]]} 35 ]]} 36 ]
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
go run complex-embedded-documents-search.go
1 [ 2 {_id 2} 3 {name Lincoln High} 4 {clubs [ 5 {sports [ 6 [ 7 {club_name dodgeball} 8 {description provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.} 9 ] [ 10 {club_name martial arts} 11 {description provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.} 12 ] 13 ]} 14 ]} 15 {score 0.633669912815094} 16 ] 17 [ 18 {_id 1} 19 {name Evergreen High} 20 {clubs [ 21 {sports [ 22 [ 23 {club_name archery} 24 {description provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.} 25 ] [ 26 {club_name ultimate frisbee} 27 {description provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.} 28 ] 29 ]} 30 ]} 31 {score 0.481589138507843} 32 ]
結果の 2 つのドキュメントは、学生がdodgeball
またはfrisbee
をプレイできるチームを提供する学校を示しています。
go run nested-embedded-documents-search.go
1 [ 2 {_id 0} 3 {teachers [[ 4 {first Jane} 5 {last Smith} 6 {classes [[{subject art of science} {grade 12th}] [{subject applied science and practical science} {grade 9th}] [{subject remedial math} {grade 12th}] [{subject science} {grade 10th}]]} 7 ] [ 8 {first Bob} 9 {last Green} 10 {classes [[{subject science of art} {grade 11th}] [{subject art art art} {grade 10th}]]} 11 ]]} 12 {score 0.9415585994720459} 13 {highlights [[ 14 {score 0.7354040145874023} 15 {path teachers.classes.subject} 16 {texts [[{value art of } {type text}] [{value science} {type hit}]]} 17 ] [ 18 {score 0.7871346473693848} 19 {path teachers.classes.subject} 20 {texts [[{value applied } {type text}] [{value science} {type hit}] [{value and practical } {type text}] [{value science} {type hit}]]} 21 ] [ 22 {score 0.7581484317779541} 23 {path teachers.classes.subject} 24 {texts [[{value science} {type hit}]]} 25 ] [ 26 {score 0.7189631462097168} 27 {path teachers.classes.subject} 28 {texts [[{value science} {type hit}] [{value of art} {type text}]]} 29 ]]} 30 ] 31 [ 32 {_id 1} 33 {teachers [[ 34 {first Jane} 35 {last Earwhacker} 36 {classes [[{subject art} {grade 9th}] [{subject science} {grade 12th}]]} 37 ] [ 38 {first John} 39 {last Smith} 40 {classes [[{subject math} {grade 12th}] [{subject art} {grade 10th}]]} 41 ]]} 42 {score 0.7779859304428101} 43 {highlights [[ 44 {score 1.502043604850769} 45 {path teachers.classes.subject} 46 {texts [[{value science} {type hit}]]} 47 ]]} 48 ]
結果の 2 つのドキュメントには、 12th
グレードscience
を学ぶ生徒が含まれています。 _id: 0
を含むドキュメントには、姓がSmith
の生徒が含まれており、 12th
はscience
を指示しています。
Atlas Search クエリのコードをコピーして、それぞれのファイルに貼り付けます。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 public class BasicEmbeddedDocumentsSearch { 14 public static void main( String[] args ) { 15 // define clauses 16 List<Document> mustClause = 17 List.of( 18 new Document( 19 "text", 20 new Document("path", "teachers.first") 21 .append("query", "John"))); 22 List<Document> shouldClause = 23 List.of( 24 new Document( 25 "text", 26 new Document("path", "teachers.last") 27 .append("query", "Smith"))); 28 29 // define query 30 Document agg = 31 new Document("$search", new Document("index", "embedded-documents-tutorial") 32 .append("embeddedDocument", 33 new Document("path", "teachers") 34 .append("operator", 35 new Document("compound", 36 new Document("must", mustClause) 37 .append("should", shouldClause)))) 38 .append("highlight", new Document("path", "teachers.last"))); 39 40 // specify connection 41 String uri = "<connection-string>"; 42 43 // establish connection and set namespace 44 try (MongoClient mongoClient = MongoClients.create(uri)) { 45 MongoDatabase database = mongoClient.getDatabase("local_school_district"); 46 MongoCollection<Document> collection = database.getCollection("schools"); 47 48 // run query and print results 49 collection.aggregate(Arrays.asList(agg, 50 limit(5), 51 project(Document.parse("{score: {$meta: 'searchScore'}, _id: 0, teachers: 1, highlights: {$meta: 'searchHighlights'}}")))) 52 .forEach(doc -> System.out.println(doc.toJson())); 53 } 54 } 55 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import java.util.Arrays; 2 import static com.mongodb.client.model.Aggregates.limit; 3 import static com.mongodb.client.model.Aggregates.project; 4 import static com.mongodb.client.model.Projections.computed; 5 import static com.mongodb.client.model.Projections.fields; 6 import static com.mongodb.client.model.Projections.include; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 public class ComplexEmbeddedDocumentQuery { 14 public static void main(String[] args) { 15 // connect to your Atlas cluster 16 String uri = "<connection-string>"; 17 18 try (MongoClient mongoClient = MongoClients.create(uri)) { 19 // set namespace 20 MongoDatabase database = mongoClient.getDatabase("my_test"); 21 MongoCollection<Document> collection = database.getCollection("schools"); 22 23 // define pipeline 24 Document agg = new Document("$search", 25 new Document("embeddedDocument", 26 new Document("path", "clubs.sports") 27 .append("operator", 28 new Document("queryString", 29 new Document("defaultPath", "clubs.sports.club_name") 30 .append("query", "dodgeball OR frisbee"))))); 31 32 // run pipeline and print results 33 collection.aggregate(Arrays.asList(agg, 34 limit(5), 35 project(fields( 36 include("name", "clubs.sports"), 37 computed("score", new Document("$meta", "searchScore")))))) 38 .forEach(doc -> System.out.println(doc.toJson())); 39 } 40 } 41 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import com.mongodb.client.MongoClient; 7 import com.mongodb.client.MongoClients; 8 import com.mongodb.client.MongoCollection; 9 import com.mongodb.client.MongoDatabase; 10 import org.bson.Document; 11 12 public class NestedEmbeddedDocumentsSearch { 13 public static void main( String[] args ) { 14 // define clauses 15 List<Document> nestedMustClause = 16 List.of( 17 new Document( 18 "text", 19 new Document("path", "teachers.classes.grade") 20 .append("query", "12th")), 21 new Document("text", 22 new Document("path", "teachers.classes.subject") 23 .append("query", "science"))); 24 List<Document> mustClause = 25 List.of( 26 new Document( 27 "embeddedDocument", 28 new Document("path", "teachers.classes") 29 .append("operator", new Document("compound", 30 new Document("must", nestedMustClause))))); 31 List<Document> shouldClause = 32 List.of( 33 new Document( 34 "text", 35 new Document("path", "teachers.last") 36 .append("query", "Smith"))); 37 38 // define query 39 Document agg = 40 new Document( 41 "$search", 42 new Document("index", "embedded-documents-tutorial") 43 .append("embeddedDocument", 44 new Document("path", "teachers") 45 .append("operator", 46 new Document("compound", 47 new Document("must", mustClause) 48 .append("should", shouldClause)))) 49 .append("highlight", new Document("path", "teachers.classes.subject"))); 50 51 // specify connection 52 String uri = "<connection-string>"; 53 54 // establish connection and set namespace 55 try (MongoClient mongoClient = MongoClients.create(uri)) { 56 MongoDatabase database = mongoClient.getDatabase("local_school_district"); 57 MongoCollection<Document> collection = database.getCollection("schools"); 58 59 // run query and print results 60 collection.aggregate(Arrays.asList(agg, 61 limit(5), 62 project(Document.parse("{score: {$meta: 'searchScore'}, _id: 0, teachers: 1, highlights: {$meta: 'searchHighlights'}}")))) 63 .forEach(doc -> System.out.println(doc.toJson())); 64 } 65 } 66 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
Java ファイルをコンパイルして実行します。
javac BasicEmbeddedDocumentsSearch.java java BasicEmbeddedDocumentsSearch
1 { 2 "teachers": [{ 3 "first": "Jane", 4 "last": "Earwhacker", 5 "classes": [{ 6 {"subject": "art", "grade": "9th"}, 7 {"subject": "science", "grade": "12th"} 8 ] 9 }, { 10 "first": "John", 11 "last": "Smith", 12 "classes": [ 13 {"subject": "math", "grade": "12th"}, 14 {"subject": "art", "grade": "10th"} 15 ] 16 }], 17 "score": 0.7830756902694702, 18 "highlights": [{ 19 "score": 1.4921371936798096, 20 "path": "teachers.last", 21 "texts": [{"value": "Smith", "type": "hit"}] 22 }] 23 } 24 { 25 "teachers": [{ 26 "first": "Jane", 27 "last": "Smith", 28 "classes": [ 29 {"subject": "science", "grade": "9th"}, 30 {"subject": "math", "grade": "12th"} 31 ] 32 }, { 33 "first": "John", 34 "last": "Redman", 35 "classes": [ 36 {"subject": "art", "grade": "12th"} 37 ] 38 }], 39 "score": 0.468008816242218, 40 "highlights": [{ 41 "score": 1.4702850580215454, 42 "path": "teachers.last", 43 "texts": [{"value": "Smith", "type": "hit"}] 44 }] 45 }
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
javac ComplexEmbeddedDocumentQuery.java java ComplexEmbeddedDocumentQuery
1 { 2 "_id": 2, 3 "name": "Lincoln High", 4 "clubs": { 5 "sports": [ 6 {"club_name": "dodgeball", "description": "provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves."}, 7 {"club_name": "martial arts", "description": "provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons."} 8 ] 9 }, 10 "score": 0.633669912815094 11 } 12 { 13 "_id": 1, 14 "name": "Evergreen High", 15 "clubs": { 16 "sports": [ 17 {"club_name": "archery", "description": "provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment."}, 18 {"club_name": "ultimate frisbee", "description": "provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes."} 19 ] 20 }, 21 "score": 0.481589138507843 22 }
結果の 2 つのドキュメントは、学生がdodgeball
またはfrisbee
をプレイできるチームを提供する学校を示しています。
javac NestedEmbeddedDocumentsSearch.java java NestedEmbeddedDocumentsSearch
1 { 2 "teachers": [{ 3 "first": "Jane", 4 "last": "Smith", 5 "classes": [ 6 {"subject": "art of science", "grade": "12th"}, 7 {"subject": "applied science and practical science", "grade": "9th"}, 8 {"subject": "remedial math", "grade": "12th"}, 9 {"subject": "science", "grade": "10th"} 10 ] 11 }, { 12 "first": "Bob", 13 "last": "Green", 14 "classes": [ 15 {"subject": "science of art", "grade": "11th"}, 16 {"subject": "art art art", "grade": "10th"} 17 ] 18 }], 19 "score": 0.9415585994720459, 20 "highlights": [{ 21 "score": 0.7354040145874023, 22 "path": "teachers.classes.subject", 23 "texts": [ 24 {"value": "art of ", "type": "text"}, 25 {"value": "science", "type": "hit"} 26 ] 27 }, { 28 "score": 0.7871346473693848, 29 "path": "teachers.classes.subject", 30 "texts": [ 31 {"value": "applied ", "type": "text"}, 32 {"value": "science", "type": "hit"}, 33 {"value": " and practical ", "type": "text"}, 34 {"value": "science", "type": "hit"} 35 ] 36 }, { 37 "score": 0.7581484317779541, 38 "path": "teachers.classes.subject", 39 "texts": [ 40 {"value": "science", "type": "hit"} 41 ] 42 }, { 43 "score": 0.7189631462097168, 44 "path": "teachers.classes.subject", 45 "texts": [ 46 {"value": "science", "type": "hit"}, 47 {"value": " of art", "type": "text"} 48 ] 49 }] 50 } 51 { 52 "teachers": [{ 53 "first": "Jane", 54 "last": "Earwhacker", 55 "classes": [ 56 {"subject": "art", "grade": "9th"}, 57 {"subject": "science", "grade": "12th"} 58 ] 59 }, { 60 "first": "John", 61 "last": "Smith", 62 "classes": [ 63 {"subject": "math", "grade": "12th"}, 64 {"subject": "art", "grade": "10th"} 65 ] 66 }], 67 "score": 0.7779859304428101, 68 "highlights": [{ 69 "score": 1.502043604850769, 70 "path": "teachers.classes.subject", 71 "texts": [{"value": "science", "type": "hit"}] 72 }] 73 }
結果の 2 つのドキュメントには、 12th
グレードscience
を学ぶ生徒が含まれています。 _id: 0
を含むドキュメントには、姓がSmith
の生徒が含まれており、 12th
はscience
を指示しています。
Atlas Search クエリのコードをコピーして、それぞれのファイルに貼り付けます。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("local_school_district") 13 val collection = database.getCollection<Document>("schools") 14 15 runBlocking { 16 // define clauses 17 val mustClauses = listOf( 18 Document( 19 "text", 20 Document("path", "teachers.first").append("query", "John") 21 ) 22 ) 23 24 val shouldClauses = listOf( 25 Document( 26 "text", 27 Document("path", "teachers.last") 28 .append("query", "Smith") 29 ) 30 ) 31 32 // define query 33 val agg = Document( 34 "\$search", Document("index", "embedded-documents-tutorial") 35 .append( 36 "embeddedDocument", 37 Document("path", "teachers") 38 .append( 39 "operator", 40 Document( 41 "compound", 42 Document("must", mustClauses) 43 .append("should", shouldClauses) 44 ) 45 ) 46 ) 47 .append("highlight", Document("path", "teachers.last")) 48 ) 49 50 // run query and print results 51 val resultsFlow = collection.aggregate<Document>( 52 listOf( 53 agg, 54 limit(5), 55 project(fields( 56 excludeId(), 57 include("teachers"), 58 computed("score", Document("\$meta", "searchScore")), 59 computed("highlights", Document("\$meta", "searchHighlights")) 60 )) 61 ) 62 ) 63 resultsFlow.collect { println(it) } 64 } 65 mongoClient.close() 66 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // connect to your Atlas cluster 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 13 // set namespace 14 val database = mongoClient.getDatabase("local_school_district") 15 val collection = database.getCollection<Document>("schools") 16 17 runBlocking { 18 // define pipeline 19 val agg = Document( 20 "\$search", 21 Document("index", "embedded-documents-tutorial") 22 .append("embeddedDocument", Document("path", "clubs.sports") 23 .append( 24 "operator", 25 Document( 26 "queryString", 27 Document("defaultPath", "clubs.sports.club_name") 28 .append("query", "dodgeball OR frisbee") 29 ) 30 ) 31 ) 32 ) 33 34 // run pipeline and print results 35 val resultsFlow = collection.aggregate<Document>( 36 listOf( 37 agg, 38 limit(5), 39 project( 40 fields( 41 include("name", "clubs.sports"), 42 computed("score", Document("\$meta", "searchScore")) 43 ) 44 ) 45 ) 46 ) 47 resultsFlow.collect { println(it) } 48 } 49 mongoClient.close() 50 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("local_school_district") 13 val collection = database.getCollection<Document>("schools") 14 15 runBlocking { 16 // define clauses 17 val nestedMustClauses = listOf( 18 Document("text", Document("path", "teachers.classes.grade") 19 .append("query", "12th")), 20 Document("text", Document("path", "teachers.classes.subject") 21 .append("query", "science")) 22 ) 23 24 val mustClauses = listOf( 25 Document( 26 "embeddedDocument", 27 Document("path", "teachers.classes") 28 .append( 29 "operator", Document( 30 "compound", 31 Document("must", nestedMustClauses) 32 ) 33 ) 34 ) 35 ) 36 37 val shouldClauses = listOf( 38 Document( 39 "text", 40 Document("path", "teachers.last") 41 .append("query", "Smith") 42 ) 43 ) 44 45 // define query 46 val agg = Document( 47 "\$search", 48 Document("index", "embedded-documents-tutorial") 49 .append( 50 "embeddedDocument", 51 Document("path", "teachers") 52 .append( 53 "operator", 54 Document( 55 "compound", 56 Document("must", mustClauses) 57 .append("should", shouldClauses) 58 ) 59 ) 60 ) 61 .append("highlight", Document("path", "teachers.classes.subject")) 62 ) 63 64 // run query and print results 65 val resultsFlow = collection.aggregate<Document>( 66 listOf( 67 agg, 68 limit(5), 69 project(fields( 70 excludeId(), 71 include("teachers"), 72 computed("score", Document("\$meta", "searchScore")), 73 computed("highlights", Document("\$meta", "searchHighlights")) 74 )) 75 ) 76 ) 77 resultsFlow.collect { println(it) } 78 } 79 mongoClient.close() 80 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
各 Kotlin ファイルを実行します。
IDE でBasicEmbeddedDocumentsSearch.kt
プログラムを実行すると、次のドキュメントが出力されます。
Document{{teachers=[Document{{first=Jane, last=Earwhacker, classes=[Document{{subject=art, grade=9th}}, Document{{subject=science, grade=12th}}]}}, Document{{first=John, last=Smith, classes=[Document{{subject=math, grade=12th}}, Document{{subject=art, grade=10th}}]}}], score=0.7830756902694702, highlights=[Document{{score=1.4921371936798096, path=teachers.last, texts=[Document{{value=Smith, type=hit}}]}}]}} Document{{teachers=[Document{{first=Jane, last=Smith, classes=[Document{{subject=science, grade=9th}}, Document{{subject=math, grade=12th}}]}}, Document{{first=John, last=Redman, classes=[Document{{subject=art, grade=12th}}]}}], score=0.468008816242218, highlights=[Document{{score=1.4702850580215454, path=teachers.last, texts=[Document{{value=Smith, type=hit}}]}}]}}
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
IDE でComplexEmbeddedDocumentQuery.kt
プログラムを実行すると、次のドキュメントが出力されます。
Document{{_id=2, name=Lincoln High, clubs=Document{{sports=[Document{{club_name=dodgeball, description=provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.}}, Document{{club_name=martial arts, description=provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.}}]}}, score=0.633669912815094}} Document{{_id=1, name=Evergreen High, clubs=Document{{sports=[Document{{club_name=archery, description=provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.}}, Document{{club_name=ultimate frisbee, description=provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.}}]}}, score=0.481589138507843}}
結果の 2 つのドキュメントは、学生がdodgeball
またはfrisbee
をプレイできるチームを提供する学校を示しています。
IDE でNestedEmbeddedDocumentsSearch.kt
プログラムを実行すると、次のドキュメントが出力されます。
Document{{teachers=[Document{{first=Jane, last=Smith, classes=[Document{{subject=art of science, grade=12th}}, Document{{subject=applied science and practical science, grade=9th}}, Document{{subject=remedial math, grade=12th}}, Document{{subject=science, grade=10th}}]}}, Document{{first=Bob, last=Green, classes=[Document{{subject=science of art, grade=11th}}, Document{{subject=art art art, grade=10th}}]}}], score=0.9415585994720459, highlights=[Document{{score=0.7354040145874023, path=teachers.classes.subject, texts=[Document{{value=art of , type=text}}, Document{{value=science, type=hit}}]}}, Document{{score=0.7871346473693848, path=teachers.classes.subject, texts=[Document{{value=applied , type=text}}, Document{{value=science, type=hit}}, Document{{value= and practical , type=text}}, Document{{value=science, type=hit}}]}}, Document{{score=0.7581484317779541, path=teachers.classes.subject, texts=[Document{{value=science, type=hit}}]}}, Document{{score=0.7189631462097168, path=teachers.classes.subject, texts=[Document{{value=science, type=hit}}, Document{{value= of art, type=text}}]}}]}} Document{{teachers=[Document{{first=Jane, last=Earwhacker, classes=[Document{{subject=art, grade=9th}}, Document{{subject=science, grade=12th}}]}}, Document{{first=John, last=Smith, classes=[Document{{subject=math, grade=12th}}, Document{{subject=art, grade=10th}}]}}], score=0.7779859304428101, highlights=[Document{{score=1.502043604850769, path=teachers.classes.subject, texts=[Document{{value=science, type=hit}}]}}]}}
結果の 2 つのドキュメントには、 12th
グレードscience
を学ぶ生徒が含まれています。 _id: 0
を含むドキュメントには、姓がSmith
の生徒が含まれており、 12th
はscience
を指示しています。
クエリのコードをコピーして、それぞれのファイルに貼り付けます。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("local_school_district"); 13 const coll = database.collection("schools"); 14 15 // define pipeline 16 const agg = [ 17 { 18 '$search': { 19 'index': 'embedded-documents-tutorial', 20 'embeddedDocument': { 21 'path': 'teachers', 22 'operator': { 23 'compound': { 24 'must': [ 25 { 26 'text': { 27 'path': 'teachers.first', 28 'query': 'John' 29 } 30 } 31 ], 32 'should': [ 33 { 34 'text': { 35 'path': 'teachers.last', 36 'query': 'Smith' 37 } 38 } 39 ] 40 } 41 } 42 }, 43 'highlight': { 44 'path': 'teachers.last' 45 } 46 } 47 }, { 48 '$project': { 49 '_id': 1, 50 'teachers': 1, 51 'score': { 52 '$meta': 'searchScore' 53 }, 54 'highlights': { 55 '$meta': 'searchHighlights' 56 } 57 } 58 } 59 ]; 60 61 // run pipeline 62 const result = coll.aggregate(agg); 63 64 // print results 65 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 66 } finally { 67 await client.close(); 68 } 69 } 70 run().catch(console.dir);
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("local_school_district"); 13 const coll = database.collection("schools"); 14 15 // define pipeline 16 const agg = [ 17 { 18 '$search': { 19 'index': 'embedded-documents-tutorial', 20 'embeddedDocument': { 21 'path': 'clubs.sports', 22 'operator': { 23 'queryString': { 24 'defaultPath': 'clubs.sports.club_name', 25 'query': 'dodgeball OR frisbee' 26 } 27 } 28 } 29 } 30 }, { 31 '$project': { 32 '_id': 1, 33 'name': 1, 34 'clubs.sports': 1, 35 'score': { 36 '$meta': 'searchScore' 37 } 38 } 39 } 40 ]; 41 42 // run pipeline 43 const result = coll.aggregate(agg); 44 45 // print results 46 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 47 } finally { 48 await client.close(); 49 } 50 } 51 run().catch(console.dir);
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 await client.connect(); 11 12 // set namespace 13 const database = client.db("local_school_district"); 14 const coll = database.collection("schools"); 15 16 // define pipeline 17 const agg = [ 18 { 19 '$search': { 20 'index': 'embedded-documents-tutorial', 21 'embeddedDocument': { 22 'path': 'teachers', 23 'operator': { 24 'compound': { 25 'must': [ 26 { 27 'embeddedDocument': { 28 'path': 'teachers.classes', 29 'operator': { 30 'compound': { 31 'must': [ 32 { 33 'text': { 34 'path': 'teachers.classes.grade', 35 'query': '12th' 36 } 37 }, { 38 'text': { 39 'path': 'teachers.classes.subject', 40 'query': 'science' 41 } 42 } 43 ] 44 } 45 } 46 } 47 } 48 ], 49 'should': [ 50 { 51 'text': { 52 'path': 'teachers.last', 53 'query': 'smith' 54 } 55 } 56 ] 57 } 58 } 59 }, 60 'highlight': { 61 'path': 'teachers.classes.subject' 62 } 63 } 64 }, { 65 '$project': { 66 '_id': 1, 67 'teachers': 1, 68 'score': { 69 '$meta': 'searchScore' 70 }, 71 'highlights': { 72 '$meta': 'searchHighlights' 73 } 74 } 75 } 76 ]; 77 78 // run pipeline 79 const result = coll.aggregate(agg); 80 81 // print results 82 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 83 } finally { 84 await client.close(); 85 } 86 } 87 run().catch(console.dir);
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
次のコマンドを実行して、コレクションをクエリします。
node basic-embedded-documents-query.js
1 { 2 "_id":1, 3 "teachers":[{ 4 "first":"Jane", 5 "last":"Earwhacker", 6 "classes":[{"subject":"art","grade":"9th"},{"subject":"science","grade":"12th"}] 7 },{ 8 "first":"John", 9 "last":"Smith", 10 "classes":[{"subject":"math","grade":"12th"},{"subject":"art","grade":"10th"}] 11 }], 12 "score":0.7830756902694702, 13 "highlights":[{ 14 "score":1.4921371936798096, 15 "path":"teachers.last", 16 "texts":[{"value":"Smith","type":"hit"}] 17 }] 18 } 19 { 20 "_id":2, 21 "teachers":[{ 22 "first":"Jane", 23 "last":"Smith", 24 "classes":[{"subject":"science","grade":"9th"},{"subject":"math","grade":"12th"}] 25 },{ 26 "first":"John", 27 "last":"Redman", 28 "classes":[{"subject":"art","grade":"12th"}] 29 }], 30 "score":0.468008816242218, 31 "highlights":[{ 32 "score":1.4702850580215454, 33 "path":"teachers.last", 34 "texts":[{"value":"Smith","type":"hit"}] 35 }] 36 }
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
node complex-embedded-documents-query.js
1 { 2 "_id":2, 3 "name":"Lincoln High", 4 "clubs":{ 5 "sports":[{ 6 "club_name":"dodgeball", 7 "description":"provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves." 8 },{ 9 "club_name":"martial arts", 10 "description":"provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons." 11 } 12 ]}, 13 "score":0.633669912815094 14 } 15 { 16 "_id":1, 17 "name":"Evergreen High", 18 "clubs":{ 19 "sports":[{ 20 "club_name":"archery", 21 "description":"provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment." 22 },{ 23 "club_name":"ultimate frisbee", 24 "description":"provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes." 25 }] 26 }, 27 "score":0.481589138507843 28 }
結果の 2 つのドキュメントは、学生がdodgeball
またはfrisbee
をプレイできるチームを提供する学校を示しています。
node nested-embedded-documents-query.js
1 { 2 "_id":0, 3 "teachers":[{ 4 "first":"Jane", 5 "last":"Smith", 6 "classes":[{"subject":"art of science","grade":"12th"},{"subject":"applied science and practical science","grade":"9th"},{"subject":"remedial math","grade":"12th"},{"subject":"science","grade":"10th"}] 7 },{ 8 "first":"Bob", 9 "last":"Green", 10 "classes":[{"subject":"science of art","grade":"11th"},{"subject":"art art art","grade":"10th"}] 11 }], 12 "score":0.9415585994720459, 13 "highlights":[{ 14 "score":0.7354040145874023, 15 "path":"teachers.classes.subject", 16 "texts":[{"value":"art of ","type":"text"},{"value":"science","type":"hit"}] 17 },{ 18 "score":0.7871346473693848, 19 "path":"teachers.classes.subject", 20 "texts":[{"value":"applied ","type":"text"},{"value":"science","type":"hit"},{"value":" and practical ","type":"text"},{"value":"science","type":"hit"}] 21 },{ 22 "score":0.7581484317779541, 23 "path":"teachers.classes.subject", 24 "texts":[{"value":"science","type":"hit"}] 25 },{ 26 "score":0.7189631462097168, 27 "path":"teachers.classes.subject", 28 "texts":[{"value":"science","type":"hit"},{"value":" of art","type":"text"}] 29 }] 30 } 31 { 32 "_id":1, 33 "teachers":[{ 34 "first":"Jane", 35 "last":"Earwhacker", 36 "classes":[{"subject":"art","grade":"9th"},{"subject":"science","grade":"12th"}] 37 },{ 38 "first":"John", 39 "last":"Smith", 40 "classes":[{"subject":"math","grade":"12th"},{"subject":"art","grade":"10th"}] 41 }], 42 "score":0.7779859304428101, 43 "highlights":[{ 44 "score":1.502043604850769, 45 "path":"teachers.classes.subject", 46 "texts":[{"value":"science","type":"hit"}] 47 }] 48 }
結果の 2 つのドキュメントには、 12th
グレードscience
を学ぶ生徒が含まれています。 _id: 0
を含むドキュメントには、姓がSmith
の生徒が含まれており、 12th
はscience
を指示しています。
コード例をコピーして、それぞれのファイルに貼り付けます。
これらのクエリの詳細については、「 クエリについて 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'embedded-documents-tutorial', 11 'embeddedDocument': { 12 'path': 'teachers', 13 'operator': { 14 'compound': { 15 'must': [ 16 { 17 'text': { 18 'path': 'teachers.first', 19 'query': 'John' 20 } 21 } 22 ], 23 'should': [ 24 { 25 'text': { 26 'path': 'teachers.last', 27 'query': 'Smith' 28 } 29 } 30 ] 31 } 32 } 33 }, 34 'highlight': { 35 'path': 'teachers.last' 36 } 37 } 38 }, { 39 '$project': { 40 '_id': 1, 41 'teachers': 1, 42 'score': { 43 '$meta': 'searchScore' 44 }, 45 'highlights': { 46 '$meta': 'searchHighlights' 47 } 48 } 49 } 50 ] 51 52 # run pipeline 53 result = client['local_school_district']['schools'].aggregate(pipeline) 54 55 # print results 56 for i in result: 57 print(i)
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'embedded-documents-tutorial', 11 'embeddedDocument': { 12 'path': 'clubs.sports', 13 'operator': { 14 'queryString': { 15 'defaultPath': 'clubs.sports.club_name', 16 'query': 'dodgeball OR frisbee' 17 } 18 } 19 } 20 } 21 }, { 22 '$project': { 23 '_id': 1, 24 'name': 1, 25 'clubs.sports': 1, 26 'score': { 27 '$meta': 'searchScore' 28 } 29 } 30 } 31 ] 32 33 # run pipeline 34 result = client['local_school_district']['schools'].aggregate(pipeline) 35 36 # print results 37 for i in result: 38 print(i)
このクエリの詳細については、「 クエリについて 」を参照してください。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'embedded-documents-tutorial', 11 'embeddedDocument': { 12 'path': 'teachers', 13 'operator': { 14 'compound': { 15 'must': [ 16 { 17 'embeddedDocument': { 18 'path': 'teachers.classes', 19 'operator': { 20 'compound': { 21 'must': [ 22 { 23 'text': { 24 'path': 'teachers.classes.grade', 25 'query': '12th' 26 } 27 }, { 28 'text': { 29 'path': 'teachers.classes.subject', 30 'query': 'science' 31 } 32 } 33 ] 34 } 35 } 36 } 37 } 38 ], 39 'should': [ 40 { 41 'text': { 42 'path': 'teachers.last', 43 'query': 'smith' 44 } 45 } 46 ] 47 } 48 } 49 }, 50 'highlight': { 51 'path': 'teachers.classes.subject' 52 } 53 } 54 }, { 55 '$project': { 56 '_id': 1, 57 'teachers': 1, 58 'score': { 59 '$meta': 'searchScore' 60 }, 61 'highlights': { 62 '$meta': 'searchHighlights' 63 } 64 } 65 } 66 ] 67 68 # run pipeline 69 result = client['local_school_district']['schools'].aggregate(pipeline) 70 71 # print results 72 for i in result: 73 print(i)
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
次のコマンドを実行して、コレクションをクエリします。
python basic-embedded-documents-query.py
1 { 2 '_id': 1, 3 'teachers': [{ 4 'first': 'Jane', 5 'last': 'Earwhacker', 6 'classes': [{'subject': 'art', 'grade': '9th'}, {'subject': 'science', 'grade': '12th'}] 7 }, { 8 'first': 'John', 9 'last': 'Smith', 10 'classes': [{'subject': 'math', 'grade': '12th'}, {'subject': 'art', 'grade': '10th'}] 11 }], 12 'score': 0.7830756902694702, 13 'highlights': [{ 14 'score': 1.4921371936798096, 15 'path': 'teachers.last', 16 'texts': [{'value': 'Smith', 'type': 'hit'}] 17 }] 18 } 19 { 20 '_id': 2, 21 'teachers': [{ 22 'first': 'Jane', 23 'last': 'Smith', 24 'classes': [{'subject': 'science', 'grade': '9th'}, {'subject': 'math', 'grade': '12th'}] 25 }, { 26 'first': 'John', 27 'last': 'Redman', 28 'classes': [{'subject': 'art', 'grade': '12th'}] 29 }], 30 'score': 0.468008816242218, 31 'highlights': [{ 32 'score': 1.4702850580215454, 33 'path': 'teachers.last', 34 'texts': [{'value': 'Smith', 'type': 'hit'}] 35 }] 36 }
結果内の 2 つのドキュメントには、最初の名前がJohn
の生徒が含まれています。 _id: 1
を含むドキュメントは、最初の名前がJohn
で、姓がSmith
という名前の担当者が含まれているため、ランクが高くなります。
python complex-embedded-documents-query.py
1 { 2 '_id': 2, 3 'name': 'Lincoln High', 4 'clubs': { 5 'sports': [{ 6 'club_name': 'dodgeball', 7 'description': 'provides students an opportunity to play dodgeball by throwing balls to eliminate the members of the opposing team while avoiding being hit themselves.' 8 }, { 9 'club_name': 'martial arts', 10 'description': 'provides students an opportunity to learn self-defense or combat that utilize physical skill and coordination without weapons.' 11 }] 12 }, 13 'score': 0.633669912815094 14 } 15 { 16 '_id': 1, 17 'name': 'Evergreen High', 18 'clubs': { 19 'sports': [{ 20 'club_name': 'archery', 21 'description': 'provides students an opportunity to practice and hone the skill of using a bow to shoot arrows in a fun and safe environment.' 22 }, { 23 'club_name': 'ultimate frisbee', 'description': 'provides students an opportunity to play frisbee and learn the basics of holding the disc and complete passes.' 24 }] 25 }, 26 'score': 0.481589138507843 27 }
python advanced-embedded-documents-query.py
1 { 2 '_id': 0, 3 'teachers': [{ 4 'first': 'Jane', 5 'last': 'Smith', 6 'classes': [{'subject': 'art of science', 'grade': '12th'}, {'subject': 'applied science and practical science', 'grade': '9th'}, {'subject': 'remedial math', 'grade': '12th'}, {'subject': 'science', 'grade': '10th'}] 7 }, { 8 'first': 'Bob', 9 'last': 'Green', 10 'classes': [{'subject': 'science of art', 'grade': '11th'}, {'subject': 'art art art', 'grade': '10th'}] 11 }], 12 'score': 0.9415585994720459, 13 'highlights': [{ 14 'score': 0.7354040145874023, 15 'path': 'teachers.classes.subject', 16 'texts': [{'value': 'art of ', 'type': 'text'}, {'value': 'science', 'type': 'hit'}] 17 }, { 18 'score': 0.7871346473693848, 19 'path': 'teachers.classes.subject', 20 'texts': [{'value': 'applied ', 'type': 'text'}, {'value': 'science', 'type': 'hit'}, {'value': ' and practical ', 'type': 'text'}, {'value': 'science', 'type': 'hit'}] 21 }, { 22 'score': 0.7581484317779541, 23 'path': 'teachers.classes.subject', 24 'texts': [{'value': 'science', 'type': 'hit'}] 25 }, { 26 'score': 0.7189631462097168, 27 'path': 'teachers.classes.subject', 28 'texts': [{'value': 'science', 'type': 'hit'}, {'value': ' of art', 'type': 'text'}] 29 }] 30 } 31 { 32 '_id': 1, 33 'teachers': [{ 34 'first': 'Jane', 35 'last': 'Earwhacker', 36 'classes': [{'subject': 'art', 'grade': '9th'}, {'subject': 'science', 'grade': '12th'}] 37 }, { 38 'first': 'John', 39 'last': 'Smith', 40 'classes': [{'subject': 'math', 'grade': '12th'}, {'subject': 'art', 'grade': '10th'}] 41 }], 42 'score': 0.7779859304428101, 43 'highlights': [{ 44 'score': 1.502043604850769, 45 'path': 'teachers.classes.subject', 46 'texts': [{'value': 'science', 'type': 'hit'}] 47 }] 48 }
埋め込みドキュメント フィールドに対して $searchMeta
クエリを実行
埋め込みドキュメント フィールドに対して$searchMeta
クエリを実行できます。 このセクションでは、Atlas クラスターに接続し、埋め込みドキュメント フィールドで$searchMeta
ステージと ファセット を使用してサンプル クエリを実行します。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
schools
コレクションに対して embeddedDocument
演算子を使用して AtlasSearch クエリを実行します。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorのSearchボタンをクリックします。
1 [ 2 { 3 "$searchMeta": { 4 "index": "embedded-documents-tutorial", 5 "facet": { 6 "operator": { 7 "text":{ 8 "path": "name", 9 "query": "High" 10 } 11 }, 12 "facets": { 13 "gradeFacet": { 14 "type": "string", 15 "path": "teachers.classes.grade" 16 } 17 } 18 } 19 } 20 } 21 ]
count: Object lowerBound: 3 facet: Object gradeFacet: Object buckets: Array (4) 0: Object _id: "12th" count: 3 1: Object _id: "9th" count : 3 2: Object _id: "10th" count: 2 3: Object _id: "11th" count: 1
mongosh
を使用してクラスターに接続します。
ターミナル ウィンドウでmongosh
を開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh
経由での接続 」を参照してください。
local_school
データベースを使用します。
mongosh
プロンプトで次のコマンドを実行します。
use local_school_district
switched to db local_school_district
schools
コレクションに対して、以下の Atlas Search クエリを実行します。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 db.schools.aggregate({ 2 "$searchMeta": { 3 "index": "embedded-documents-tutorial", 4 "facet": { 5 "operator": { 6 "text":{ 7 "path": "name", 8 "query": "High" 9 } 10 }, 11 "facets": { 12 "gradeFacet": { 13 "type": "string", 14 "path": "teachers.classes.grade" 15 } 16 } 17 } 18 } 19 })
1 [ 2 { 3 count: { lowerBound: Long('3') }, 4 facet: { 5 gradeFacet: { 6 buckets: [ 7 { _id: '12th', count: Long('3') }, 8 { _id: '9th', count: Long('3') }, 9 { _id: '10th', count: Long('2') }, 10 { _id: '11th', count: Long('1') } 11 ] 12 } 13 } 14 } 15 ]
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。
MongoDB Compass のクラスターに接続します。
MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。
schools
コレクションに対して、以下のAtlas Searchクエリを実行します。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
パイプラインステージ | クエリ | |||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
MongoDB Compass は、結果に次の内容を表示します。
結果より、 |
クエリをコピーして Program.cs
ファイルに貼り付けます。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 6 public class EmbeddedDocumentsFacetExample 7 { 8 private const string MongoConnectionString = "<connection-string>"; 9 10 public static void Main(string[] args) 11 { 12 // allow automapping of the camelCase database fields to our MovieDocument 13 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 14 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 15 16 // connect to your Atlas cluster 17 var mongoClient = new MongoClient(MongoConnectionString); 18 var districtDatabase = mongoClient.GetDatabase("local_school_district"); 19 var schoolCollection = districtDatabase.GetCollection<SchoolDocument>("schools"); 20 21 // define and run pipeline 22 var results = schoolCollection.Aggregate() 23 .SearchMeta(Builders<SchoolDocument>.Search.Facet( 24 Builders<SchoolDocument>.Search.Text(school => school.Name, "High"), 25 Builders<SchoolDocument>.SearchFacet.String("gradeFacet", "teachers.classes.grade")), 26 indexName: "embedded-documents-tutorial") 27 .Single(); 28 29 // print results 30 Console.WriteLine(results.ToJson()); 31 } 32 } 33 34 [ ]35 public class SchoolDocument 36 { 37 public int Id { get; set; } 38 public string Name { get; set; } 39 public TeacherDocument[] Teachers { get; set; } 40 } 41 [ ]42 public class TeacherDocument 43 { 44 public ClassDocument[] Classes { get; set; } 45 } 46 [ ]47 public class ClassDocument 48 { 49 public string Grade { get; set; } 50 }
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
Program.cs
ファイルをコンパイルして実行します。
dotnet run embedded-documents-facet-query.csproj
{ "count" : { "lowerBound" : NumberLong(3), "total" : null }, "facet" : { "gradeFacet" : { "buckets" : [ { "_id" : "12th", "count" : NumberLong(3) }, { "_id" : "9th", "count" : NumberLong(3) }, { "_id" : "10th", "count" : NumberLong(2) }, { "_id" : "11th", "count" : NumberLong(1) } ] } } }
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。
例に挙げたクエリをコピーして embedded-documents-facet-query
ファイルに貼り付けます。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$searchMeta", bson.M{ 25 "index": "embedded-documents-tutorial", 26 "facet": bson.M{ 27 "operator": bson.M{ 28 "text": bson.M{ 29 "path": "name", 30 "query": "High"}, 31 }, 32 "facets": bson.M{ 33 "gradeFacet": bson.M{ 34 "path": "teachers.classes.grade", 35 "type": "string"}, 36 }}}}} 37 38 // run pipeline 39 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage}) 40 if err != nil { 41 panic(err) 42 } 43 44 // print results 45 var results []bson.D 46 if err = cursor.All(context.TODO(), &results); err != nil { 47 panic(err) 48 } 49 for _, result := range results { 50 fmt.Println(result) 51 } 52 }
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
次のコマンドを実行して、コレクションをクエリします。
go run embedded-documents-facet-query.go
1 [ 2 {count [{lowerBound 3}]} 3 {facet [ 4 {gradeFacet [ 5 {buckets [ 6 [{_id 12th} {count 3}] 7 [{_id 9th} {count 3}] 8 [{_id 10th} {count 2}] 9 [{_id 11th} {count 1}] 10 ]} 11 ]} 12 ]} 13 ]
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。
Atlas Search クエリのコードをコピーして FacetEmbeddedDocumentsSearch.java
ファイルに貼り付けます。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 import com.mongodb.client.MongoClient; 2 import com.mongodb.client.MongoClients; 3 import com.mongodb.client.MongoCollection; 4 import com.mongodb.client.MongoDatabase; 5 import org.bson.Document; 6 import java.util.Arrays; 7 8 public class FacetEmbeddedDocumentsSearch { 9 public static void main(String[] args) { 10 // connect to your Atlas cluster 11 String uri = "<connection-string>"; 12 try (MongoClient mongoClient = MongoClients.create(uri)) { 13 // set namespace 14 MongoDatabase database = mongoClient.getDatabase("local_school_district"); 15 MongoCollection<Document> collection = database.getCollection("schools"); 16 17 // define pipeline 18 Document agg = new Document("$searchMeta", 19 new Document( "index", "embedded-documents-tutorial") 20 .append("facet", 21 new Document("operator", 22 new Document("text", 23 new Document("path", "name") 24 .append("query", "High"))) 25 .append("facets", 26 new Document("gradeFacet", 27 new Document("type", "string").append("path", "teachers.classes.grade")) 28 ))); 29 // run pipeline and print results 30 collection.aggregate(Arrays.asList(agg)) 31 .forEach(doc -> System.out.println(doc.toJson())); 32 } 33 } 34 }
注意
Maven 環境でサンプル コードを実行するには、 ファイルのインポート ステートメントの上に次のコードを追加します。
package com.mongodb.drivers;
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
Java ファイルをコンパイルして実行します。
javac FacetEmbeddedDocumentsSearch.java java FacetEmbeddedDocumentsSearch
1 { 2 "count": {"lowerBound": 3}, 3 "facet": { 4 "gradeFacet": { 5 "buckets": [ 6 {"_id": "12th", "count": 3}, 7 {"_id": "9th", "count": 3}, 8 {"_id": "10th", "count": 2}, 9 {"_id": "11th", "count": 1} 10 ] 11 } 12 } 13 }
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。
次の依存関係をプロジェクトに必ず追加してください。
MongoDB
mongodb-driver-kotlin-coroutine 詳細については、「 MongoDB を依存関係として追加する 」を参照してください。
直列化ライブラリ
bson-kotlinx 詳細については、「直列化ライブラリの依存関係の追加 」を参照してください。
クエリをコピーして EmbeddedDocumentsFacetQuery.kt
ファイルに貼り付けます。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 import com.mongodb.kotlin.client.coroutine.MongoClient 2 import kotlinx.coroutines.runBlocking 3 import org.bson.Document 4 5 fun main() { 6 // establish connection and set namespace 7 val uri = "<connection-string>" 8 val mongoClient = MongoClient.create(uri) 9 val database = mongoClient.getDatabase("local_school_district") 10 val collection = database.getCollection<Document>("schools") 11 12 runBlocking { 13 14 // define query 15 val agg = Document( 16 "\$searchMeta", 17 Document("index", "embedded-documents-tutorial") 18 .append("facet", 19 Document( 20 "operator", 21 Document( 22 "text", 23 Document("path", "name") 24 .append("query", "High") 25 ) 26 ) 27 .append( 28 "facets", 29 Document( 30 "gradeFacet", 31 Document("type", "string").append("path", "teachers.classes.grade") 32 ) 33 ) 34 ) 35 ) 36 37 // run query and print results 38 val resultsFlow = collection.aggregate<Document>(listOf(agg)) 39 resultsFlow.collect { println(it) } 40 } 41 mongoClient.close() 42 }
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
EmbeddedDocumentsFacetQuery.kt
ファイルを実行します。
IDE でEmbeddedDocumentsFacetQuery.kt
プログラムを実行すると、次のドキュメントが出力されます。
Document{{ count=Document{{lowerBound=3}}, facet=Document{{ gradeFacet=Document{{ buckets=[ Document{{_id=12th, count=3}}, Document{{_id=9th, count=3}}, Document{{_id=10th, count=2}}, Document{{_id=11th, count=1}} ] }} }} }}
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。
クエリのコードをコピーして、embedded-documents-facet-query.js
ファイルに貼り付けます。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas cluster 4 const uri = "<connection-string>"; 5 const client = new MongoClient(uri); 6 7 async function run() { 8 try { 9 await client.connect(); 10 11 // set namespace 12 const database = client.db("local_school_district"); 13 const coll = database.collection("schools"); 14 15 // define pipeline 16 const agg = [ 17 { 18 "$searchMeta": { 19 "index": "embedded-documents-tutorial", 20 "facet": { 21 "operator": { 22 "text":{ 23 "path": "name", 24 "query": "High" 25 } 26 }, 27 "facets": { 28 "gradeFacet": { 29 "type": "string", 30 "path": "teachers.classes.grade" 31 } 32 } 33 } 34 } 35 } 36 ]; 37 38 // run pipeline 39 const result = coll.aggregate(agg); 40 41 // print results 42 await result.forEach((doc) => console.dir(JSON.stringify(doc))); 43 } finally { 44 await client.close(); 45 } 46 } 47 run().catch(console.dir);
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
次のコマンドを実行して、コレクションをクエリします。
node embedded-documents-facet-query.js
1 { 2 "count":{"lowerBound":3}, 3 "facet":{ 4 "gradeFacet":{ 5 "buckets":[ 6 {"_id":"12th","count":3}, 7 {"_id":"9th","count":3}, 8 {"_id":"10th","count":2}, 9 {"_id":"11th","count":1} 10 ] 11 } 12 } 13 }
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。
例に挙げたコードをコピーして、embedded-documents-facet-query.py
ファイルに貼り付けます。
このクエリは、上位学校を検索し、各バージョンでクラスを提供する学校の数をリクエストします。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [{"$searchMeta": { 8 "index": "embedded-documents-tutorial", 9 "facet": { 10 "operator": { 11 "text": {"path": "name", "query": 'High'} 12 }, 13 "facets": { 14 "gradeFacet": {"type": "string", "path": "teachers.classes.grade"} 15 } 16 } 17 }}] 18 19 # run pipeline 20 result = client["local_school_district"]["schools"].aggregate(pipeline) 21 22 # print results 23 for i in result: 24 print(i)
クエリ内の <connection-string>
を置き換え、ファイルを保存します。
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
次のコマンドを実行して、コレクションをクエリします。
python embedded-documents-facet-query.py
1 { 2 'count': {'lowerBound': 3}, 3 'facet': { 4 'gradeFacet': { 5 'buckets': [ 6 {'_id': '12th', 'count': 3}, 7 {'_id': '9th', 'count': 3}, 8 {'_id': '10th', 'count': 2}, 9 {'_id': '11th', 'count': 1} 10 ] 11 } 12 } 13 }
結果より、 3
の学校は12th
と9th
のクラスを提供し、 2
の学校は10th
グレードのクラスを提供し、 1
の学校は11th
グレードのクラスを提供しています。 埋め込まれたドキュメント内のフィールドをファセットすると、クエリは最上位の親ドキュメントの カウント を返します。これはこのクエリのteachers
フィールドです。