このチュートリアルでは、ドキュメントの配列がそれ自体がネストされている場合でも、ドキュメントの配列内のフィールドに対して Atlas Search クエリをインデックスて実行する方法を説明します。これらのフィールドに対するクエリを有効にするには、ドキュメントフィールドを embeddedDocuments 型としてインデックス。
このページのチュートリアルでは、以下のタイプの配列内のフィールドに対するクエリについて説明しています。
ドキュメントの配列。
ドキュメント内にあるドキュメントの配列。
ドキュメントの配列の中にあるドキュメントの配列。
コレクションについて
schools
サンプル コレクションには 3 つのドキュメントが含まれています。各ドキュメントには、学校の name
と mascot
、各教師の ``first`` ネームと last
ネーム、教師が教えている classes
(subject
とgrade
を含む)、参加可能なさまざまな clubs
が含まれています。
インデックスについて
このコレクションのインデックスでは、配列内の次のドキュメントを指定します。
パスと
teachers
teachers.classes
パスにある配列内のドキュメントは embeddedDocuments としてインデックス付けされ、ドキュメント内のフィールドは 動的に インデックス付けされます。teachers
パスにある配列内のドキュメントも、 強調表示 をサポートするために ドキュメント タイプとしてインデックス付けされ、ドキュメント内のフィールドは動的にインデックス化されます。clubs
フィールドのドキュメントは、 動的マッピング が有効になっている ドキュメント タイプとしてインデックス付けされ、clubs.sports
フィールド内のドキュメントの配列は、動的マッピングが有効になっているembeddedDocuments
タイプとしてインデックス付けされます。
クエリについて
サンプル クエリは、 schools
コレクション内の埋め込みドキュメントを検索します。 クエリは、次のパイプライン ステージを使用します。
$search
コレクションを検索します。$project
を使用してコレクションのフィールドを除外し、結果にscore
という名前のフィールドを追加します。 ハイライトを有効にするクエリの場合、$project
ステージはハイライト情報を含むhighlights
という新しいフィールドも追加します。
チュートリアルでは、次のクエリについて説明します。
このクエリは、ドキュメントの配列内のフィールドに対する検索を示します。
teachers
パスで最初の名前がJohn
の指示を検索し、 Smith
という姓の担当者を優先します。 また、 last
名前フィールドの強調表示も有効になります。
このクエリは、ドキュメント内にネストされているドキュメントの配列内のフィールドに対する検索を示します。
これは、 clubs.sports
パスでdodgeball
またはfrisbee
のいずれかを実行する機会を提供するサポートが必要な学校を検索します。
このクエリでは、次の配列内のフィールドを検索する複合クエリが示されています。
ドキュメントの配列。
ドキュメントの配列内にネストされたドキュメントの配列。
クエリが teachers.classes
パスで検索するのは、12th
年生の science
クラスを教えている教師がいる学校で、Smith
という名字の先生がそのクラスを教えている学校が優先されます。また、ドキュメントの teachers
配列内にネストされているドキュメントの classes
内の subject
フィールドでハイライト機能も有効になります。
注意
クラスターのチュートリアルには、各学年でクラスを提供する学校数を取得するための $searchMeta
クエリも含まれています。
埋め込みドキュメントに対してクエリを実行する
このチュートリアルでは、埋め込みドキュメントのフィールドに対する Atlas Search クエリについてサンプルを用いて説明します。これらのクエリの詳細については、「このチュートリアルについて」を参照してください。
次のいずれかの方法を使用して、このチュートリアルを完了できます。
事前構成された 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 で、オブジェクト サンプル クエリを使用してネストされた配列にアクセスします。
Data Source、Index、Query ペインを確認します。
Data Sourceペインにはサンプル コレクションが含まれています。
Indexペインには、コレクションのインデックス定義が含まれています。
Queryペインにはクエリが表示されます。
Atlas Search Playground へのアクセス。
Atlas Search Playground のサンプル配列クエリ内にネストされた配列にアクセスします。
Data Source、Index、Query ペインを確認します。
Data Sourceペインにはサンプル コレクションが含まれています。
Indexペインには、コレクションのインデックス定義が含まれています。
Queryペインにはクエリが表示されます。
このチュートリアルでは、埋め込みドキュメントを対象にクエリを実行する方法を示す次のステップについて順を追って説明します。
Atlas クラスターに埋め込みドキュメントを含む、
schools
という名前のサンプル コレクションを作成します。次のパスで構成されたembeddedDocumentsフィールドを含む Atlas Search インデックスを設定します。
teachers
フィールドteachers.classes
フィールドclubs.sports
フィールド
embeddedDocument と
$search
テキストを含む複合を使用して、schools
コレクション内の埋め込みドキュメントを検索する クエリを実行します。カウントを取得するには、埋め込みドキュメント フィールドに対して
$searchMeta
クエリを実行します。
開始する前に、Atlas クラスターが前提条件 に記載されている要件を満たしていることを確認してください。
サンプル コレクションの作成とデータのロード
まず、Atlas クラスター上の既存または新規のデータベースに「schools
」という名前の Atlas コレクションを作成します。コレクションを作成したら、サンプル データをコレクションにアップロードします。サンプル ドキュメントのコレクションの詳細については、「このチュートリアルについて」を参照してください。
このセクションの手順では、新しいデータベースとコレクションの作成、サンプル データをコレクションにロードする手順を説明します。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
警告
ナビゲーションの改善が進行中
現在、新しく改善されたナビゲーション エクスペリエンスを展開しています。次の手順が Atlas UIのビューと一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーの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 インデックスを作成します。
手順
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
警告
ナビゲーションの改善が進行中
現在、新しく改良されたナビゲーション エクスペリエンスを導入中です。次の手順が Atlas UI の表示と一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
インデックスの設定を開始します。
ページで次の選択を行い、Next をクリックしてください。
Search Type | Atlas Search のインデックスタイプを選択します。 |
Index Name and Data Source | 以下の情報を指定してください。
|
Configuration Method | For a guided experience, select Visual Editor. To edit the raw index definition, select JSON Editor. |
注意
Atlas Search インデックスのデフォルト名は「default
」です。この名前を変更しない場合、Atlas Search クエリのデフォルトの検索インデックスが使用され、その演算子では別の index
オプションは指定されません。複数のインデックスを作成する場合は、インデックス全体で一貫性があり、内容がわかる命名規則を維持することをお勧めします。
埋め込みドキュメントにインデックスを作成するインデックス構成を指定します。
インデックス定義の詳細については、「 このチュートリアルについて 」を参照してください。
[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
Token
該当なし
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": "token" 34 } 35 }, 36 "type": "document" 37 } 38 }, 39 "type": "document" 40 } 41 ] 42 } 43 } 44 } [Next] をクリックします。
埋め込みドキュメント フィールドに対して $search
クエリを実行
埋め込みドキュメント フィールドに対してクエリを実行できます。 このチュートリアルでは、クエリの 複合 演算子 内で embeddedDocument 演算子と テキスト 演算子を使用します。
このセクションでは、Atlas クラスターに接続し、 schools
コレクションのフィールドに対して演算子を使用してサンプル クエリを実行します。
➤ このページの [言語の選択] ドロップダウンメニューを使用して、このセクションの例の言語を設定します。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
警告
ナビゲーションの改善が進行中
現在、新しく改良されたナビゲーション エクスペリエンスを導入中です。次の手順が Atlas UI の表示と一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーの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/v2/bson" 8 "go.mongodb.org/mongo-driver/v2/mongo" 9 "go.mongodb.org/mongo-driver/v2/mongo/options" 10 ) 11 12 func main() { 13 // Connects to your Atlas cluster 14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // Sets the namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 searchStage := bson.D{{Key: "$search", Value: bson.M{ 24 "index": "embedded-documents-tutorial", 25 "embeddedDocument": bson.M{ 26 "path": "teachers", "operator": bson.M{ 27 "compound": bson.M{ 28 "must": bson.A{ 29 bson.M{ 30 "text": bson.D{ 31 {Key: "path", Value: "teachers.first"}, 32 {Key: "query", Value: "John"}, 33 }, 34 }, 35 }, 36 "should": bson.A{ 37 bson.M{ 38 "text": bson.D{ 39 {Key: "path", Value: "teachers.last"}, 40 {Key: "query", Value: "Smith"}, 41 }, 42 }, 43 }, 44 }, 45 }, 46 }, 47 "highlight": bson.D{{Key: "path", Value: "teachers.last"}}, 48 }}} 49 50 projectStage := bson.D{ 51 {Key: "$project", Value: bson.D{ 52 {Key: "teachers", Value: 1}, 53 {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}}, 54 {Key: "highlights", Value: bson.D{{Key: "$meta", Value: "searchHighlights"}}}, 55 }}, 56 } 57 58 // Runs the pipeline 59 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 60 if err != nil { 61 panic(err) 62 } 63 64 // Prints the results 65 var results []bson.D 66 if err = cursor.All(context.TODO(), &results); err != nil { 67 panic(err) 68 } 69 for _, result := range results { 70 fmt.Println(result) 71 } 72 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリに関する詳細については、「このチュートリアルについて」を参照してください。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/v2/bson" 8 "go.mongodb.org/mongo-driver/v2/mongo" 9 "go.mongodb.org/mongo-driver/v2/mongo/options" 10 ) 11 12 func main() { 13 // Connects to your Atlas cluster 14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // Sets the namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // Defines the pipeline stages 24 searchStage := bson.D{{Key: "$search", Value: bson.M{ 25 "index": "embedded-documents-tutorial", 26 "embeddedDocument": bson.D{ 27 {Key: "path", Value: "clubs.sports"}, 28 {Key: "operator", Value: bson.D{ 29 {Key: "queryString", Value: bson.D{ 30 {Key: "defaultPath", Value: "clubs.sports.club_name"}, 31 {Key: "query", Value: "dodgeball OR frisbee"}, 32 }}, 33 }}, 34 }, 35 }}} 36 37 projectStage := bson.D{ 38 {Key: "$project", Value: bson.D{ 39 {Key: "name", Value: 1}, 40 {Key: "clubs.sports", Value: 1}, 41 {Key: "score", Value: bson.D{ 42 {Key: "$meta", Value: "searchScore"}, 43 }}, 44 }}, 45 } 46 47 // Runs the pipeline 48 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 49 if err != nil { 50 panic(err) 51 } 52 53 // Prints the results 54 var results []bson.D 55 if err = cursor.All(context.TODO(), &results); err != nil { 56 panic(err) 57 } 58 for _, result := range results { 59 fmt.Println(result) 60 } 61 }
サンプルを実行する前に、<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
このクエリに関する詳細については、「このチュートリアルについて」を参照してください。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/v2/bson" 8 "go.mongodb.org/mongo-driver/v2/mongo" 9 "go.mongodb.org/mongo-driver/v2/mongo/options" 10 ) 11 12 func main() { 13 // Connects to your Atlas cluster 14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // Sets the namespace 21 collection := client.Database("local_school_district").Collection("schools") 22 23 // Defines the pipeline stages 24 searchStage := bson.D{{Key: "$search", Value: 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 {Key: "path", Value: "teachers.classes.grade"}, 40 {Key: "query", Value: "12th"}, 41 }, 42 }, 43 bson.M{ 44 "text": bson.D{ 45 {Key: "path", Value: "teachers.classes.subject"}, 46 {Key: "query", Value: "science"}, 47 }, 48 }, 49 }, 50 }, 51 }, 52 }, 53 }, 54 }, 55 "should": bson.A{ 56 bson.M{ 57 "text": bson.D{ 58 {Key: "path", Value: "teachers.last"}, 59 {Key: "query", Value: "Smith"}, 60 }, 61 }, 62 }, 63 }, 64 }, 65 }, 66 "highlight": bson.D{{Key: "path", Value: "teachers.classes.subject"}}, 67 }}} 68 69 projectStage := bson.D{ 70 {Key: "$project", Value: bson.D{ 71 {Key: "teachers", Value: 1}, 72 {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}}, 73 {Key: "highlights", Value: bson.D{{Key: "$meta", Value: "searchHighlights"}}}, 74 }}, 75 } 76 77 // Runs the pipeline 78 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 79 if err != nil { 80 panic(err) 81 } 82 83 // Prints the results 84 var results []bson.D 85 if err = cursor.All(context.TODO(), &results); err != nil { 86 panic(err) 87 } 88 for _, result := range results { 89 fmt.Println(result) 90 } 91 }
サンプルを実行する前に、<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します。
警告
ナビゲーションの改善が進行中
現在、新しく改良されたナビゲーション エクスペリエンスを導入中です。次の手順が Atlas UI の表示と一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーの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/v2/bson" 8 "go.mongodb.org/mongo-driver/v2/mongo" 9 "go.mongodb.org/mongo-driver/v2/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(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{ 25 {Key: "$searchMeta", Value: bson.M{ 26 "index": "embedded-documents-tutorial", 27 "facet": bson.M{ 28 "operator": bson.M{ 29 "text": bson.M{ 30 "path": "name", 31 "query": "High", 32 }, 33 }, 34 "facets": bson.M{ 35 "gradeFacet": bson.M{ 36 "path": "teachers.classes.grade", 37 "type": "string", 38 }, 39 }, 40 }, 41 }}, 42 } 43 44 // run pipeline 45 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage}) 46 if err != nil { 47 panic(err) 48 } 49 50 // print results 51 var results []bson.D 52 if err = cursor.All(context.TODO(), &results); err != nil { 53 panic(err) 54 } 55 for _, result := range results { 56 fmt.Println(result) 57 } 58 }
クエリ内の <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
フィールドです。