Docs Menu
Docs Home
/
MongoDB Atlas
/ /

Atlas Search 結果を並べ替える方法

項目一覧

  • サンプル データのロード
  • Atlas Search インデックスの作成
  • Overview
  • 手順
  • 検索結果を並べ替える
  • 文字列のソート

このチュートリアルでは、Atlas Search の結果を、 sample_mflix.moviesコレクション内の数値フィールド、日付フィールド、string フィールドで昇順または降順でソートする方法について説明します。 また、Atlas Search の結果を大文字と小文字を区別せずに並べ替える方法も示します。 コレクションに Atlas Search インデックスを作成するときに、string フィールドの値を小文字に正規化するようにインデックスを構成できます。 これにより、ソートされたフィールドの大文字と小文字に関係なく、クエリ結果をソートできます。

Atlas Search sortオプションのデフォルトの動作を使用して、Atlas Search の結果を数値フィールド、日付フィールド、string フィールドで並べ替える方法については、チュートリアルで次の手順に従います。

  1. Atlas Searchstringtitleという名前のreleased フィールド、 という名前の日付フィールド、 という名前の数値フィールドにawards.wins sample_mflix.moviesインデックスを作成し、これらのフィールドに対してクエリを実行し、これらのフィールドで結果を並べ替えます。

    注意

    動的マッピングを有効にすると、Atlas Search は並べ替えのために数値型と日付型を自動的にインデックス化します。 ソート用にstringフィールドを動的にインデックスすることはありません。 代わりに、ソート用の string フィールドをインデックスするには、トークンタイプを使用する必要があります。

  2. sample_mflix.moviesコレクション内のtitlereleasedawards.winsフィールドに対して Atlas Search クエリを実行し、結果をこれらのフィールドで昇順または降順でソートします。

Atlas Search sortオプションを使用して、string フィールドの値を小文字に正規化して Atlas Search 結果を並べ替える方法を示すには、チュートリアルでは次の手順に従います。

  1. サンプル ドキュメントを Atlas クラスターのsample_mflix.moviesコレクションにロードします。

  2. titleという名前の string フィールドに、実行中のクエリとこのフィールドで結果を並べ替える両方用の Atlas Search インデックスを作成します。

    注意

    動的マッピングを有効にすると、Atlas Search は並べ替えのために数値型と日付型を自動的にインデックス化します。 ソート用にstringフィールドを動的にインデックスすることはありません。 代わりに、ソート用の string フィールドをインデックスするには、トークンタイプを使用する必要があります。

  3. コレクションのtitleフィールドに対して Atlas Search クエリを実行し、結果をインデックス付きフィールドで並べ替えます。

開始する前に、Atlas クラスターが前提条件 に記載されている要件を満たしていることを確認してください。

Atlas Search インデックスを作成するには、プロジェクトに対するProject Data Access Admin以上のアクセス権が必要です。

デフォルトのsort動作を使用して、 sample_mflix.moviesコレクション内のドキュメントを数値フィールド、日付フィールド、string フィールドで並べ替えるには、このセクションをスキップして、コレクションのインデックスの作成に進むことができます。

Atlas Search が大文字と小文字に関係なくドキュメントをソートする方法を示すために、サンプル ドキュメントを提供します。 各サンプル ドキュメントは映画を表し、映画のタイトル(小文字)、ジャンル、付与数を指定する 3 つのフィールドが含まれています。 このセクションでは、サンプル ドキュメントを Atlas クラスターのsample_mflix.moviesコレクションにロードします。 Atlas UI または mongoshを使用してサンプル コレクションをロードできます。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2

クラスターの [Browse Collections] ボタンをクリックします。

Data Explorerが表示されます。

3

Atlas UI またはmongoshからコレクションを読み込むことができます。

  1. sample_mflixデータベースを展開し、 moviesコレクションを選択します。

  2. コレクションに追加するサンプルドキュメントごとに、次の操作を行います。

    1. デフォルトのドキュメントを置き換えるには、 Insert Documentをクリックし、 JSONビュー( {} )を選択します。

    2. 次のサンプル ドキュメントを一度に 1 つずつコピーして貼り付け、 Insertをクリックして各ドキュメントをコレクションに追加します。

    1{
    2 "genres": [ "Action", "Drama", "Thriller" ],
    3 "title": "atomic train",
    4 "awards": { "wins": 1, "nominations": 1 }
    5}
    1{
    2 "genres": [ "Animation", "Adventure", "Family" ],
    3 "title": "how to train your dragon",
    4 "awards": { "wins": 32, "nominations": 51 }
    5}
  1. 接続するクラスターの Connect をクリックします。

  2. Shellを選択し、 mongoshを介してクラスターに接続する手順を完了します。

    詳しくは、「 mongosh経由で接続 」を参照してください。

  3. mongoshsample_mflixデータベースに切り替えます。

    use sample_mflix
    switched to db sample_mflix
  4. 選択したデータベースにコレクションを読み込みするには、 mongoshで次のコマンドを実行します。

    1db.movies.insertMany([
    2 {
    3 "_id": 1,
    4 "genres": [ "Action", "Drama", "Thriller" ],
    5 "title": "atomic train",
    6 "awards": { wins: 1, nominations: 1 }
    7 },
    8 {
    9 "_id": 2,
    10 "genres": [ "Animation", "Adventure", "Family" ],
    11 "title": "how to train your dragon",
    12 "awards": { "wins": 32, "nominations": 51 },
    13 }
    14])
    { acknowledged: true, insertedIds: { '0': 1, '1': 2 } }

このセクションでは、 sample_mflix.moviesコレクション内のtitlereleased 、およびawards.winsフィールドに Atlas Search インデックスを作成し、これらのフィールドに対してクエリを実行し、結果をこれらのフィールドで並べ替えます。

このセクションでは、 sample_mflix.moviesコレクションのtitleフィールドに Atlas Search インデックスを作成し、このフィールドに対してクエリを実行し、結果をこのフィールドで並べ替えます。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3
4
  • ガイドを利用する場合は、Atlas Search Visual Editor を選択します。

  • Raw インデックス定義を編集するには、Atlas Search JSON Editor を選択します。

5
  1. Index Nameフィールドにsort-tutorialと入力します。

    インデックスにdefaultと名付けると、 $searchパイプライン ステージでindexパラメータを指定する必要がなくなります。 インデックスにカスタム名を付ける場合は、 indexパラメータでこの名前を指定する必要があります。

  2. Database and Collectionセクションで、 sample_mflixデータベースを検索し、 moviesコレクションを選択します。

6

次のインデックス定義。

  • クエリと結果をフィールドで並べ替える両方で、 awards.winsフィールドを数値型としてインデックスします。

  • クエリと結果をフィールドで並べ替える両方で、 releasedフィールドを日付型としてインデックスします。

  • titleフィールドのインデックス作成と検索の両方に使用するキーワードアナライザを指定し、 titleフィールドを次のタイプとしてインデックス化します。

    • フィールドをクエリするためのstringタイプ。

    • フィールドで結果をソートするためのトークンタイプ。

    Atlas Search Visual Editorまたは Atlas Search JSON Editorを使用して Atlas UI でインデックスを作成できます。

  1. [Next] をクリックします。

  2. [Refine Your Index] をクリックします。

  3. Index Configurationsセクションで、Dynamic Mapping を無効に切り替える。

  4. Field Mappingsセクションで、 Add FieldをクリックしてAdd Field Mappingウィンドウを表示します。

  5. [Customized Configuration] をクリックします。

  6. 次のフィールドを一度に 1 つずつ、対応するドロップダウンからフィールド名とデータ型を選択し、プロパティを設定するか、デフォルトを受け入れて、 Addをクリックします。

    フィールド名
    データ型
    プロパティ
    awards.wins
    番号
    デフォルトを受け入れます。
    released
    日付
    デフォルトを受け入れます。
    title
    Token
    デフォルトを受け入れます。
    title
    文字列
    [ Index Analyzer ] ドロップダウンと [ Search Analyzer ] ドロップダウンの両方から [ lucene.keyword ] を選択します。
  1. デフォルトのインデックス定義を、以下の定義で置き換えます。

    {
    "mappings": {
    "dynamic": false,
    "fields": {
    "awards": {
    "dynamic": false,
    "fields": {
    "wins": [
    {
    "type": "number"
    }
    ]
    },
    "type": "document"
    },
    "released": [
    {
    "type": "date"
    }
    ],
    "title": [{
    "type": "token"
    }, {
    "type": "string",
    "analyzer": "lucene.keyword",
    "searchAnalyzer": "lucene.keyword"
    }]
    }
    }
    }
  2. [Next] をクリックします。

7
8

インデックスが作成中であることを知らせるモーダル ウィンドウが表示されます。Close ボタンをクリックします。

9

インデックスの構築には約 1 分かかります。 作成している間、 Status列にはBuild in Progressと表示されます。 作成が完了すると、 Status列にはActiveと表示されます。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2
3
  • ガイドを利用する場合は、Atlas Search Visual Editor を選択します。

  • Raw インデックス定義を編集するには、Atlas Search JSON Editor を選択します。

4
  1. Index Nameフィールドにcase-insensitive-sortと入力します。

    インデックスにdefaultと名付けると、 $searchパイプライン ステージでindexパラメータを指定する必要がなくなります。 インデックスにカスタム名を付ける場合は、 indexパラメータでこの名前を指定する必要があります。

  2. Database and Collectionセクションで、 sample_mflixデータベースを検索し、 moviesコレクションを選択します。

5

次のインデックス定義では、 titleフィールドを次のタイプとしてインデックス化します。

  • ソート用のトークン型。 lowercase正規表現を使用してインデックス付きのタームを小文字に変換します。

  • フィールドをクエリするためのstringタイプ。

インデックスを作成するには、 インターフェースで または を使用できます。Atlas SearchVisual EditorAtlas SearchJSON EditorAtlas user

  1. [Next] をクリックします。

  2. [Refine Your Index] をクリックします。

  3. Index Configurationsセクションで、Dynamic Mapping を無効に切り替える。

  4. Field Mappingsセクションで、 Add FieldをクリックしてAdd Field Mappingウィンドウを表示します。

  5. [Customized Configuration] をクリックします。

  6. Field Nameドロップダウンからtitleを選択します。

  7. Data TypeドロップダウンからTokenを選択します。

  8. [ Token Propertiesを展開し、 Normalizerドロップダウンから [ lowercase ] を選択します。

  9. [Add] をクリックします。

  10. 手順deを繰り返します。

  11. Data TypeドロップダウンからStringを選択します。

  12. [Add] をクリックします。

  1. デフォルトのインデックス定義を、以下の定義で置き換えます。

    1{
    2 "mappings": {
    3 "dynamic": false,
    4 "fields": {
    5 "title": [{
    6 "type": "token",
    7 "normalizer": "lowercase"
    8 },{
    9 "type": "string"
    10 }]
    11 }
    12 }
    13}
  2. [Next] をクリックします。

6

インデックスが作成中であることを知らせるモーダル ウィンドウが表示されます。

7

インデックスの構築には約 1 分かかります。 作成している間、 Status列にはInitial Syncと表示されます。 作成が完了すると、 Status列にはActiveと表示されます。


➤ [言語の選択]ドロップダウン メニューを使用して、このセクション内の例の言語を設定します。


検索結果は複数の方法で並べ替えることができます。 このセクションでは、Atlas クラスターに接続し、 sample_mflix.moviesコレクション内のインデックス付きフィールドに対してサンプル クエリを実行します。

サンプル クエリの$searchステージでは、 sortオプションを使用して Atlas Search の結果をインデックス付き数値フィールドでソートします。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3

クエリするインデックスの右側にある [ Query ] ボタンをクリックします。

4

[ Edit Queryをクリックすると、 JSON形式のデフォルトのクエリ構文サンプルが表示されます。

5

次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorSearchボタンをクリックします。

[
{
"$search": {
"index": "sort-tutorial",
"range": {
"path": "awards.wins",
"gte": 10
},
"sort": {
"awards.wins": -1,
}
}
}
]
SCORE: 1 _id: "573a13d5f29313caabd9cae7"
fullplot: "Based on an incredible true story of one man's fight for survival and …"
imdb: Object
...
year: 2013
...
awards: Object
wins: 267
...
...
SCORE: 1 _id: "573a13c7f29313caabd74a4d"
fullplot: "Dr. Ryan Stone (Sandra Bullock) is a brilliant medical engineer on her…"
imdb: Object
...
year: 2013
...
awards: Object
wins: 231
...
...
SCORE: 1 _id: "573a13cbf29313caabd808d2"
fullplot: "Dr. Ryan Stone (Sandra Bullock) is a brilliant medical engineer on her…"
imdb: Object
...
year: 2013
...
awards: Object
wins: 231
...
...
SCORE: 1 _id: “573a13dff29313caabdb7adb”"
fullplot: "Actor Riggan Thomson is most famous for his movie role from over twent…"
imdb: Object
...
year: 2014
...
awards: Object
wins: 210
...
...
SCORE: 1 _id: "573a13bef29313caabd5c06c"
plot: "The life of Mason, from early childhood to his arrival at college."
imdb: Object
...
runtime: 165
...
awards: Object
wins: 185
...
...
SCORE: 1 _id: "573a139ef29313caabcfbd6a"
fullplot: "While Frodo & Sam continue to approach Mount Doom to destroy the One R…"
imdb: Object
...
year: 2003
...
awards: Object
wins: 175
...
...
SCORE: 1 _id: "573a13b5f29313caabd447f5"
plot: "In rural Texas, welder and hunter Llewelyn Moss discovers the remains …"
imdb: Object
...
year: 2007
...
awards: Object
wins: 172
...
...
SCORE: 1 _id: "573a13c3f29313caabd68d9f"
plot: "On a fall night in 2003, Harvard undergrad and computer programming ge…"
imdb: Object
...
year: 2010
...
awards: Object
wins: 171
...
...
SCORE: 1 _id: "573a13c5f29313caabd6ee61"
fullplot: "Dom Cobb is a skilled thief, the absolute best in the dangerous art of…"
imdb: Object
...
year: 2010
...
awards: Object
wins: 162
...
...
SCORE: 1 _id: "573a13bdf29313caabd58fd3"
plot: "The story of Jamal Malik, an 18 year-old orphan from the slums of Mumb…"
imdb: Object
...
year: 2008
...
awards: Object
wins: 161
...
...
6

Search Testerでは、返されるドキュメント内のすべてのフィールドが表示されない場合があります。 クエリパスで指定したフィールドを含むすべてのフィールドを表示するには、結果内のドキュメントを展開します。

1

ターミナル ウィンドウでmongoshを開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh経由での接続 」を参照してください。

2

mongoshプロンプトで次のコマンドを実行します。

use sample_mflix
3

次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

クエリは、次のパイプライン ステージを使用します。

  • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

  • $limitステージを使用して、出力を5の結果に制限します。

  • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

1db.movies.aggregate([
2 {
3 "$search": {
4 "index": "sort-tutorial",
5 "range": {
6 "path": "awards.wins",
7 "gte": 10
8 },
9 "sort": {
10 "awards.wins": -1,
11 }
12 }
13 },
14 {
15 $limit: 5
16 },
17 {
18 "$project": {
19 "_id": 0,
20 "title": 1,
21 "awards.wins": 1
22 }
23 }
24])
[
{
title: '12 Years a Slave',
awards: { wins: 267 }
},
{
title: 'Gravity',
awards: { wins: 231 }
},
{
title: 'Gravity',
awards: { wins: 231 }
},
{
title: 'Birdman: Or (The Unexpected Virtue of Ignorance)',
awards: { wins: 210 }
},
{
title: 'Boyhood',
awards: { wins: 185 }
}
]
1

MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。

2

Database画面で、 sample_mflixデータベースをクリックし、 moviesコレクションをクリックします。

3

次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

クエリは、次のパイプライン ステージを使用します。

  • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

  • $limitステージを使用して、出力を5の結果に制限します。

  • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

MongoDB Compass でこのクエリを実行するには:

  1. [Aggregations] タブをクリックします。

  2. Select...をクリックし、ドロップダウンからステージを選択し、そのステージのクエリを追加して、次の各パイプライン ステージを構成します。 ステージを追加するには、 Add Stageをクリックします。

    パイプラインステージ
    クエリ
    $search
    {
    index: "sort-tutorial",
    "range": {
    "path": "awards.wins",
    "gte": 10
    },
    "sort": {
    "awards.wins": -1,
    }
    }
    $limit
    5
    $project
    {
    title: 1,
    released: 1,
    year: 1
    }

    Auto Previewを有効にした場合、MongoDB Compass は$limitパイプライン ステージの横に次のドキュメントを表示します。

    [
    {
    title: '12 Years a Slave',
    awards: { wins: 267 }
    },
    {
    title: 'Gravity',
    awards: { wins: 231 }
    },
    {
    title: 'Gravity',
    awards: { wins: 231 }
    },
    {
    title: 'Birdman: Or (The Unexpected Virtue of Ignorance)',
    awards: { wins: 210 }
    },
    {
    title: 'Boyhood',
    awards: { wins: 185 }
    }
    ]
1
  1. sort-by-numbers-example という新しいディレクトリを作成し、dotnet new コマンドでプロジェクトを初期化します。

    mkdir sort-by-numbers-example
    cd sort-by-numbers-example
    dotnet new console
  2. .NET/C# ドライバーを依存関係としてプロジェクトに追加します。

    dotnet add package MongoDB.Driver
2
  1. Program.cs ファイルの内容を、次のコードで置き換えます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

      クエリは、次のパイプライン ステージを使用します。

      • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

      • $limitステージを使用して、出力を5の結果に制限します。

      • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class SortByNumbers
    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 MovieDocument
    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 mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define search options
    23 var searchOptions = new SearchOptions<MovieDocument>()
    24 {
    25 Sort = Builders<MovieDocument>.Sort.Descending(movies => movies.Awards.Wins),
    26 IndexName = "sort-tutorial"
    27 };
    28
    29 // define and run pipeline
    30 var results = moviesCollection.Aggregate()
    31 .Search(
    32 Builders<MovieDocument>.Search.Range(movie => movie.Awards.Wins, SearchRangeBuilder.Gte(10)), searchOptions)
    33 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    34 .Exclude(movie => movie.Id)
    35 .Include(movie => movie.Title)
    36 .Include(movie => movie.Awards.Wins))
    37 .Limit(5)
    38 .ToList();
    39
    40 // print results
    41 foreach (var movie in results)
    42 {
    43 Console.WriteLine(movie.ToJson());
    44 }
    45 }
    46}
    47
    48[BsonIgnoreExtraElements]
    49public class MovieDocument
    50{
    51 [BsonIgnoreIfDefault]
    52 public ObjectId Id { get; set; }
    53 public string Title { get; set; }
    54 public Award Awards { get; set; }
    55}
    56
    57public class Award
    58{
    59 [BsonIgnoreIfDefault]
    60 public int Wins { get; set; }
    61}
  2. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
dotnet run Program.cs
{ "title" : "12 Years a Slave", "awards" : { "wins" : 267 } }
{ "title" : "Gravity", "awards" : { "wins" : 231 } }
{ "title" : "Gravity", "awards" : { "wins" : 231 } }
{ "title" : "Birdman: Or (The Unexpected Virtue of Ignorance)", "awards" : { "wins" : 210 } }
{ "title" : "Boyhood", "awards" : { "wins" : 185 } }
1
2

このコード例では、次のタスクを実行します。

  • mongodb パッケージと依存関係をインポートします。

  • Atlas クラスターへの接続を確立します。

  • 次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

    クエリは、次のパイプライン ステージを使用します。

    • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

    • $limitステージを使用して、出力を5の結果に制限します。

    • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1package main
2
3import (
4 "context"
5 "fmt"
6
7 "go.mongodb.org/mongo-driver/bson"
8 "go.mongodb.org/mongo-driver/mongo"
9 "go.mongodb.org/mongo-driver/mongo/options"
10)
11
12func main() {
13 // connect to your Atlas cluster
14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
15 if err != nil {
16 panic(err)
17 }
18 defer client.Disconnect(context.TODO())
19
20 // set namespace
21 collection := client.Database("sample_mflix").Collection("movies")
22
23 // define pipeline stages
24 searchStage := bson.D{{"$search", bson.D{
25 {"index", "sort-tutorial"},
26 {"range", bson.D{
27 {"path", "awards.wins"},
28 {"gte", 10},
29 }},
30 {"sort", bson.D{{"awards.wins", -1}}},
31 }}}
32 limitStage := bson.D{{"$limit", 5}}
33 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"awards.wins", 1}, {"_id", 0}}}}
34
35 // run pipeline
36 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
37 if err != nil {
38 panic(err)
39 }
40
41 // print results
42 var results []bson.D
43 if err = cursor.All(context.TODO(), &results); err != nil {
44 panic(err)
45 }
46 for _, result := range results {
47 fmt.Println(result)
48 }
49}

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
go run sort-by-numbers.go
[{title 12 Years a Slave} {awards [{wins 267}]}]
[{title Gravity} {awards [{wins 231}]}]
[{title Gravity} {awards [{wins 231}]}]
[{title Birdman: Or (The Unexpected Virtue of Ignorance)} {awards [{wins 210}]}]
[{title Boyhood} {awards [{wins 185}]}]
1
junit
4.11以降のバージョン
mongodb-driver-sync
4.3.0以降のバージョン
slf4j-log4j12
1.7.30以降のバージョン
2
  1. SortByNumbers.javaという名前のファイルを作成します。

  2. 次のコードをコピーして、 SortByNumbers.javaファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

      クエリは、次のパイプライン ステージを使用します。

      • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

      • $limitステージを使用して、出力を5の結果に制限します。

      • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1import java.util.Arrays;
    2
    3import static com.mongodb.client.model.Aggregates.limit;
    4import static com.mongodb.client.model.Aggregates.project;
    5import static com.mongodb.client.model.Projections.excludeId;
    6import static com.mongodb.client.model.Projections.fields;
    7import static com.mongodb.client.model.Projections.include;
    8import com.mongodb.client.MongoClient;
    9import com.mongodb.client.MongoClients;
    10import com.mongodb.client.MongoCollection;
    11import com.mongodb.client.MongoDatabase;
    12import org.bson.Document;
    13
    14public class SortByNumbers {
    15 public static void main( String[] args ) {
    16 // define query
    17 Document agg =
    18 new Document("$search",
    19 new Document("index", "sort-tutorial")
    20 .append("range",
    21 new Document("path", "awards.wins")
    22 .append("gte", 10L))
    23 .append("sort",
    24 new Document("awards.wins", -1L)));
    25
    26 // specify connection
    27 String uri = "<connection-string>";
    28
    29 // establish connection and set namespace
    30 try (MongoClient mongoClient = MongoClients.create(uri)) {
    31 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    32 MongoCollection<Document> collection = database.getCollection("movies");
    33
    34 // run query and print results
    35 collection.aggregate(Arrays.asList(agg,
    36 limit(5),
    37 project(fields(excludeId(), include("title"), include("awards.wins")))))
    38 .forEach(doc -> System.out.println(doc.toJson()));
    39 }
    40 }
    41}

    注意

    Maven 環境でサンプル コードを実行するには、 ファイルのインポート ステートメントの上に次のコードを追加します。

    package com.mongodb.drivers;
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. SortByNumbers.javaファイルをコンパイルして実行します。

    javac SortByNumbers.java
    java SortByNumbers
    {"title": "12 Years a Slave", "awards": {"wins": 267}}
    {"title": "Gravity", "awards": {"wins": 231}}
    {"title": "Gravity", "awards": {"wins": 231}}
    {"title": "Birdman: Or (The Unexpected Virtue of Ignorance)", "awards": {"wins": 210}}
    {"title": "Boyhood", "awards": {"wins": 185}}
1
mongodb-driver-kotlin-coroutine
4.10.0以降のバージョン
2
  1. SortByNumbers.ktという名前のファイルを作成します。

  2. 次のコードをコピーして、 SortByNumbers.ktファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

      クエリは、次のパイプライン ステージを使用します。

      • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

      • $limitステージを使用して、出力を5の結果に制限します。

      • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

    • クエリに一致するドキュメントをAggregateFlowインスタンスから出力します。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12 val database = mongoClient.getDatabase("sample_mflix")
    13 val collection = database.getCollection<Document>("movies")
    14
    15 runBlocking {
    16 // define query
    17 val agg = Document(
    18 "\$search",
    19 Document("index", "sort-tutorial")
    20 .append(
    21 "range",
    22 Document("path", "awards.wins")
    23 .append("gte", 10L)
    24 )
    25 .append(
    26 "sort",
    27 Document("awards.wins", -1L)
    28 )
    29 )
    30
    31 // run query and print results
    32 val resultsFlow = collection.aggregate<Document>(
    33 listOf(
    34 agg,
    35 limit(5),
    36 project(fields(
    37 excludeId(),
    38 include("title", "awards.wins")
    39 ))
    40 )
    41 )
    42 resultsFlow.collect { println(it) }
    43 }
    44 mongoClient.close()
    45}
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. SortByNumbers.ktファイルを実行します。

    IDE でSortByNumbers.ktプログラムを実行すると、次のドキュメントが出力されます。

    Document{{title=12 Years a Slave, awards=Document{{wins=267}}}}
    Document{{title=Gravity, awards=Document{{wins=231}}}}
    Document{{title=Gravity, awards=Document{{wins=231}}}}
    Document{{title=Birdman: Or (The Unexpected Virtue of Ignorance), awards=Document{{wins=210}}}}
    Document{{title=Boyhood, awards=Document{{wins=185}}}}
1
2

このコード例では、次のタスクを実行します。

  • MongoDB の Node.js ドライバーであるmongodbをインポートします。

  • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

  • 次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

    クエリは、次のパイプライン ステージを使用します。

    • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

    • $limitステージを使用して、出力を5の結果に制限します。

    • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1const { MongoClient } = require("mongodb");
2
3// Replace the uri string with your MongoDB deployments connection string.
4const uri =
5 "<connection-string>";
6
7const client = new MongoClient(uri);
8
9async function run() {
10 try {
11 await client.connect();
12
13 // set namespace
14 const database = client.db("sample_mflix");
15 const coll = database.collection("movies");
16
17 // define pipeline
18 const agg = [
19 {
20 '$search': {
21 'index': 'sort-tutorial',
22 'range': {
23 'path': 'awards.wins',
24 'gte': 10
25 },
26 'sort': {
27 'awards.wins': -1
28 }
29 }
30 }, {
31 '$limit': 5
32 }, {
33 '$project': {
34 '_id': 0,
35 'title': 1,
36 'awards.wins': 1
37 }
38 }
39 ];
40
41 // run pipeline
42 const result = await coll.aggregate(agg);
43
44 // print results
45 await result.forEach((doc) => console.log(doc));
46
47 } finally {
48 await client.close();
49 }
50}
51run().catch(console.dir);

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
node sort-by-numbers.js
{ title: '12 Years a Slave', awards: { wins: 267 } }
{ title: 'Gravity', awards: { wins: 231 } }
{ title: 'Gravity', awards: { wins: 231 } }
{
title: 'Birdman: Or (The Unexpected Virtue of Ignorance)',
awards: { wins: 210 }
}
{ title: 'Boyhood', awards: { wins: 185 } }
1
2

次のコード例では、次を行います。

  • pymongo、MongoDB の Python ドライバー、およびDNSシード リスト接続文字列を使用してpymongoAtlas に接続するために必要なdns モジュールをインポートします。

  • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

  • 次のクエリは、結果を数値フィールドでソートする方法を示しています。 範囲演算子を使用して、10 個以上の賞を受賞した映画を検索し、結果を数値フィールド値で降順にソートします。

    クエリは、次のパイプライン ステージを使用します。

    • $searchステージでは、 awards.winsフィールドを検索し、結果を降順でソートします。

    • $limitステージを使用して、出力を5の結果に制限します。

    • $projectステージでは、 titleawards.winsを除くすべてのフィールドが除外されます。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1import datetime
2import pymongo
3
4# connect to your Atlas cluster
5client = pymongo.MongoClient('<connection-string>')
6
7# define pipeline
8pipeline = [
9 {
10 '$search': {
11 'index': 'sort-tutorial',
12 'range': {
13 'path': 'awards.wins',
14 'gte': 10
15 },
16 'sort': {
17 'awards.wins': -1
18 }
19 }
20 }, {
21 '$limit': 5
22 }, {
23 '$project': {'_id': 0, 'title': 1, 'awards.wins': 1
24 }
25 }
26]
27
28# run pipeline
29result = client['sample_mflix']['movies'].aggregate(pipeline)
30
31# print results
32for i in result:
33 print(i)

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
python sort-by-numbers.py
{'title': '12 Years a Slave', 'awards': {'wins': 267}}
{'title': 'Gravity', 'awards': {'wins': 231}}
{'title': 'Gravity', 'awards': {'wins': 231}}
{'title': 'Birdman: Or (The Unexpected Virtue of Ignorance)', 'awards': {'wins': 210}}
{'title': 'Boyhood', 'awards': {'wins': 185}}

サンプル クエリの$searchステージでは、 sortオプションを使用して Atlas Search の結果をインデックス付き日付フィールドでソートします。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3

クエリするインデックスの右側にある [ Query ] ボタンをクリックします。

4

[ Edit Queryをクリックすると、 JSON形式のデフォルトのクエリ構文サンプルが表示されます。

5

次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

  • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

  • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

    注意

    日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorSearchボタンをクリックします。

[
{
$search: {
"index": "sort-tutorial",
"compound": {
"filter": [{
"wildcard": {
"query": "Summer*",
"path": "title"
}
}],
"must": [{
"near": {
"pivot": 13149000000,
"path": "released",
"origin": ISODate("2014-04-18T00:00:00.000+00:00")
}
}]
},
"sort": {
"released": -1,
"title": 1
}
}
}
]
SCORE: 0.348105788230896 _id: "573a13f0f29313caabddaf7a"
countries: Array
runtime: 104
cast: Array
...
title: "Summer Nights"
...
released: 2015-01-28T00:00:00.000+00:00
...
SCORE: 0.5917375683784485 _id: "573a13e6f29313caabdc673b"
plot: "25-year-old Iiris and Karoliina have been best friends since childhood…"
genres: Array
runtime: 90
...
title: "Summertime"
...
released: 2014-08-01T00:00:00.000+00:00
...
SCORE: 0.9934720396995544 _id: "573a13eff29313caabdd760c"
plot: "Erik Sparrow is one of the lucky ones. He's got a good job. He's in a …"
genres: Array
runtime: 86
...
title: "Summer of Blood"
...
released: 2014-04-17T00:00:00.000+00:00
...
SCORE: 0.15982933342456818 _id: "573a13cff29313caabd8ab74"
plot: "The story of an adult and a teenage couple during a brief summer holid…"
genres: Array
countries: Array
...
title: "Summer Games"
...
released: 2012-02-08T00:00:00.000+00:00
...
SCORE: 0.13038821518421173 _id: "573a13cef29313caabd87f4e"
plot: "Summer of Goliath is a documentary/fiction hybrid that narrates variou…"
genres: Array
runtime: 78
...
title: "Summer of Goliath"
...
released: 2011-07-08T00:00:00.000+00:00
...
SCORE: 0.08124520629644394 _id: "573a13c7f29313caabd7608d"
plot: "A student tries to fix a problem he accidentally caused in OZ, a digit…"
genres: Array
runtime: 114
...
title: "Summer Wars"
...
released: 2009-08-01T00:00:00.000+00:00
SCORE: 0.0711759403347969 _id: "573a13bbf29313caabd54ee6"
plot: "The life of a public school epitomized by disobedient student Jonah Ta…"
genres: Array
runtime: 30
...
title: "Summer Heights High"
...
released: 2008-11-09T00:00:00.000+00:00
...
SCORE: 0.06951779872179031 _id: "573a13bff29313caabd5f935"
plot: "On his spring break at the seaside, with his wife and his four year ol…"
genres: Array
runtime: 102
...
title: "Summer Holiday"
...
released: 2008-09-19T00:00:00.000+00:00
...
SCORE: 0.05834990739822388 _id: "573a13c0f29313caabd628ac"
plot: "Kochi Uehara is a fourth grade student living in the suburb of Tokyo. …"
genres: Array
runtime: 138
...
title: "Summer Days with Coo"
...
released: 2007-07-28T00:00:00.000+00:00
...
SCORE: 0.056174591183662415 _id: "573a13b8f29313caabd4c1d0"
fullplot: "Country girl Yu Hong leaves her village, her family and her lover to s…"
genres: Array
runtime: 158
...
title: "Summer Palace"
...
released: 2007-04-18T00:00:00.000+00:00
...
6

Search Testerでは、返されるドキュメント内のすべてのフィールドが表示されない場合があります。 クエリパスで指定したフィールドを含むすべてのフィールドを表示するには、結果内のドキュメントを展開します。

1

ターミナル ウィンドウでmongoshを開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh経由での接続 」を参照してください。

2

mongoshプロンプトで次のコマンドを実行します。

use sample_mflix
3

次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

  • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

  • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

    注意

    日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

クエリは、次のパイプライン ステージを使用します。

  • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

  • $limitステージを使用して、出力を5の結果に制限します。

  • $project stageを次のように設定します。

    • titlereleasedを除くすべてのフィールドを除外します。

    • scoreという名前のフィールドを追加します。

1db.movies.aggregate([
2{
3 $search: {
4 "index": "sort-tutorial",
5 "compound": {
6 "filter": [{
7 "wildcard": {
8 "query": "Summer*",
9 "path": "title"
10 }
11 }],
12 "must": [{
13 "near": {
14 "pivot": 13149000000,
15 "path": "released",
16 "origin": ISODate("2014-04-18T00:00:00.000+00:00")
17 }
18 }]
19 },
20 "sort": {
21 "released": -1
22 }
23 }
24},
25{
26 $limit: 5
27},
28{
29 $project: {
30 "_id": 0,
31 "title": 1,
32 "released": 1,
33 "score": {
34 "$meta": "searchScore"
35 }
36 }
37}])
[
{
title: 'Summer Nights',
released: ISODate("2015-01-28T00:00:00.000Z"),
score: 0.348105788230896
},
{
title: 'Summertime',
released: ISODate("2014-08-01T00:00:00.000Z"),
score: 0.5917375683784485
},
{
title: 'Summer of Blood',
released: ISODate("2014-04-17T00:00:00.000Z"),
score: 0.9934720396995544
},
{
title: 'Summer Games',
released: ISODate("2012-02-08T00:00:00.000Z"),
score: 0.15982933342456818
},
{
title: 'Summer of Goliath',
released: ISODate("2011-07-08T00:00:00.000Z"),
score: 0.13038821518421173
}
]
1

MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。

2

Database画面で、 sample_mflixデータベースをクリックし、 moviesコレクションをクリックします。

3

次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

  • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

  • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

    注意

    日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

クエリは、次のパイプライン ステージを使用します。

  • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

  • $limitステージを使用して、出力を5の結果に制限します。

  • $project stageを次のように設定します。

    • titlereleasedを除くすべてのフィールドを除外します。

    • scoreという名前のフィールドを追加します。

MongoDB Compass でこのクエリを実行するには:

  1. [Aggregations] タブをクリックします。

  2. Select...をクリックし、ドロップダウンからステージを選択し、そのステージのクエリを追加して、次の各パイプライン ステージを構成します。 ステージを追加するには、 Add Stageをクリックします。

    パイプラインステージ
    クエリ
    $search
    {
    "index": "sort-tutorial",
    "compound": {
    "filter": [{
    "wildcard": {
    "query": "Summer*",
    "path": "title"
    }
    }],
    "must": [{
    "near": {
    "pivot": 13149000000,
    "path": "released",
    "origin": ISODate("2014-04-18T00:00:00.000+00:00")
    }
    }]
    },
    "sort": {
    "released": -1
    }
    }
    $limit
    5
    $project
    {
    _id: 0,
    title: 1,
    released: 1,
    score: { $meta: "searchScore" }
    }

    Auto Previewを有効にした場合、MongoDB Compass は$limitパイプライン ステージの横に次のドキュメントを表示します。

    {
    title: 'Summer Nights',
    released: 2015-01-28T00:00:00.000+00:00,
    score: 0.348105788230896
    },
    {
    title: 'Summertime',
    released: 2014-08-01T00:00:00.000+00:00,
    score: 0.5917375683784485
    },
    {
    title: 'Summer of Blood',
    released: 2014-04-17T00:00:00.000+00:00,
    score: 0.9934720396995544
    },
    {
    title: 'Summer Games',
    released: 2012-02-08T00:00:00.000+00:00,
    score: 0.15982933342456818
    },
    {
    title: 'Summer of Goliath',
    released: 2011-07-08T00:00:00.000+00:00,
    score: 0.13038821518421173
    }
1
  1. sort-by-date-example という新しいディレクトリを作成し、dotnet new コマンドでプロジェクトを初期化します。

    mkdir sort-by-date-example
    cd sort-by-date-example
    dotnet new console
  2. .NET/C# ドライバーを依存関係としてプロジェクトに追加します。

    dotnet add package MongoDB.Driver
2
  1. Program.cs ファイルの内容を、次のコードで置き換えます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

      • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

      • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

        注意

        日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

      クエリは、次のパイプライン ステージを使用します。

      • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

      • $limitステージを使用して、出力を5の結果に制限します。

      • $project stageを次のように設定します。

        • titlereleasedを除くすべてのフィールドを除外します。

        • scoreという名前のフィールドを追加します。

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class SortByStrings
    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 MovieDocument
    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 mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22
    23 // declare data for compound query
    24 var originDate = new DateTime(2014, 04, 18, 0, 0, 0, DateTimeKind.Utc);
    25
    26 // define search options
    27 var searchOptions = new SearchOptions<MovieDocument>()
    28 {
    29 Sort = Builders<MovieDocument>.Sort.Descending(movie => movie.Released),
    30 IndexName = "sort-tutorial"
    31 };
    32
    33 // define and run pipeline
    34 var results = moviesCollection.Aggregate()
    35 .Search(Builders<MovieDocument>.Search.Compound()
    36 .Filter(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Summer*"))
    37 .Must(Builders<MovieDocument>.Search.Near(movie => movie.Released, originDate, 13149000000)), searchOptions)
    38 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    39 .Include(movie => movie.Released)
    40 .Include(movie => movie.Title)
    41 .Exclude(movie => movie.Id)
    42 .MetaSearchScore(movie => movie.Score))
    43 .Limit(5)
    44 .ToList();
    45
    46 // print results
    47 foreach (var movie in results)
    48 {
    49 Console.WriteLine(movie.ToJson());
    50 }
    51 }
    52}
    53
    54[BsonIgnoreExtraElements]
    55public class MovieDocument
    56{
    57 [BsonIgnoreIfDefault]
    58 public ObjectId Id { get; set; }
    59 public DateTime Released { get; set; }
    60 public string Title { get; set; }
    61 public double Score { get; set; }
    62}
  2. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
dotnet run Program.cs
{ "released" : ISODate("2015-01-28T00:00:00Z"), "title" : "Summer Nights", "score" : 0.348105788230896 }
{ "released" : ISODate("2014-08-01T00:00:00Z"), "title" : "Summertime", "score" : 0.59173756837844849 }
{ "released" : ISODate("2014-04-17T00:00:00Z"), "title" : "Summer of Blood", "score" : 0.99347203969955444 }
{ "released" : ISODate("2014-01-17T00:00:00Z"), "title" : "Summer in February", "score" : 0.62580311298370361 }
{ "released" : ISODate("2012-02-08T00:00:00Z"), "title" : "Summer Games", "score" : 0.15982933342456818 }
1
2

このコード例では、次のタスクを実行します。

  • mongodb パッケージと依存関係をインポートします。

  • Atlas クラスターへの接続を確立します。

  • 次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

    • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

    • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

      注意

      日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

    クエリは、次のパイプライン ステージを使用します。

    • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

    • $limitステージを使用して、出力を5の結果に制限します。

    • $project stageを次のように設定します。

      • titlereleasedを除くすべてのフィールドを除外します。

      • scoreという名前のフィールドを追加します。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1package main
2
3import (
4 "context"
5 "fmt"
6 "time"
7
8 "go.mongodb.org/mongo-driver/bson"
9 "go.mongodb.org/mongo-driver/mongo"
10 "go.mongodb.org/mongo-driver/mongo/options"
11)
12
13func main() {
14 // connect to your Atlas cluster
15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string"))
16 if err != nil {
17 panic(err)
18 }
19 defer client.Disconnect(context.TODO())
20
21 // set namespace
22 collection := client.Database("sample_mflix").Collection("movies")
23
24 // define pipeline stages
25 searchStage := bson.D{{"$search", bson.M{
26 "index": "sort-tutorial",
27 "compound": bson.M{
28 "filter": bson.A{
29 bson.M{
30 "wildcard": bson.D{
31 {"path", "title"},
32 {"query", "Summer*"},
33 }},
34 },
35 "must": bson.A{
36 bson.M{
37 "near": bson.M{
38 "path": "released",
39 "origin": time.Date(2014, time.April, 18, 0, 0, 0, 0, time.UTC),
40 "pivot": 13149000000}},
41 },
42 },
43 "sort": bson.D{{"released", -1}},
44 }}}
45
46 limitStage := bson.D{{"$limit", 5}}
47 projectStage := bson.D{{"$project", bson.D{{"_id", 0}, {"title", 1}, {"released", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
48
49 // run pipeline
50 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
51 if err != nil {
52 panic(err)
53 }
54
55 // print results
56 var results []bson.D
57 if err = cursor.All(context.TODO(), &results); err != nil {
58 panic(err)
59 }
60 for _, result := range results {
61 fmt.Println(result)
62 }
63}

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
go run sort-by-date.go
[{title Summer Nights} {released 1422403200000} {score 0.348105788230896}]
[{title Summertime} {released 1406851200000} {score 0.5917375683784485}]
[{title Summer of Blood} {released 1397692800000} {score 0.9934720396995544}]
[{title Summer Games} {released 1328659200000} {score 0.15982933342456818}]
[{title Summer of Goliath} {released 1310083200000} {score 0.13038821518421173}]
1
junit
4.11以降のバージョン
mongodb-driver-sync
4.3.0以降のバージョン
slf4j-log4j12
1.7.30以降のバージョン
2
  1. SortByDate.javaという名前のファイルを作成します。

  2. 次のコードをコピーして、 SortByDate.javaファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

      • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

      • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

        注意

        日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

      クエリは、次のパイプライン ステージを使用します。

      • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

      • $limitステージを使用して、出力を5の結果に制限します。

      • $project stageを次のように設定します。

        • titlereleasedを除くすべてのフィールドを除外します。

        • scoreという名前のフィールドを追加します。

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1import java.util.Arrays;
    2import java.util.List;
    3
    4import static com.mongodb.client.model.Aggregates.limit;
    5import static com.mongodb.client.model.Aggregates.project;
    6import static com.mongodb.client.model.Projections.*;
    7import com.mongodb.client.MongoClient;
    8import com.mongodb.client.MongoClients;
    9import com.mongodb.client.MongoCollection;
    10import com.mongodb.client.MongoDatabase;
    11import org.bson.Document;
    12
    13import java.time.Instant;
    14import java.util.Date;
    15
    16public class SortByDate {
    17 public static void main( String[] args ) {
    18 // define query
    19 Document agg =
    20 new Document("$search",
    21 new Document("index", "sort-tutorial")
    22 .append("compound",
    23 new Document("filter", Arrays.asList(new Document("wildcard",
    24 new Document("query", "Summer*")
    25 .append("path", "title"))))
    26 .append("must", Arrays.asList(new Document("near",
    27 new Document("pivot", 13149000000L)
    28 .append("path", "released")
    29 .append("origin", Date.from(Instant.parse("2014-04-18T00:00:00.000+00:00")))))))
    30 .append("sort", new Document("released", -1)));
    31
    32 // specify connection
    33 String uri = "<connection-string>";
    34
    35 // establish connection and set namespace
    36 try (MongoClient mongoClient = MongoClients.create(uri)) {
    37 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
    38 MongoCollection<Document> collection = database.getCollection("movies");
    39 // run query and print results
    40 collection.aggregate(Arrays.asList(agg,
    41 limit(5),
    42 project(fields(exclude("_id"), include("title"), include("released"), computed("score", new Document("$meta", "searchScore"))))))
    43 .forEach(doc -> System.out.println(doc.toJson()));
    44 }
    45 }
    46}

    注意

    Maven 環境でサンプル コードを実行するには、 ファイルのインポート ステートメントの上に次のコードを追加します。

    package com.mongodb.drivers;
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. SortDateForSpeed.javaファイルをコンパイルして実行します。

    javac SortByDate.java
    java SortByDate
    {"title": "Summer Nights", "released": {"$date": "2015-01-28T00:00:00Z"}, "score": 0.348105788230896}
    {"title": "Summertime", "released": {"$date": "2014-08-01T00:00:00Z"}, "score": 0.5917375683784485}
    {"title": "Summer of Blood", "released": {"$date": "2014-04-17T00:00:00Z"}, "score": 0.9934720396995544}
    {"title": "Summer Games", "released": {"$date": "2012-02-08T00:00:00Z"}, "score": 0.15982933342456818}
    {"title": "Summer of Goliath", "released": {"$date": "2011-07-08T00:00:00Z"}, "score": 0.13038821518421173}
1
mongodb-driver-kotlin-coroutine
4.10.0以降のバージョン
2
  1. SortByDate.ktという名前のファイルを作成します。

  2. 次のコードをコピーして、 SortByDate.ktファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

      • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

      • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

        注意

        日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

      クエリは、次のパイプライン ステージを使用します。

      • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

      • $limitステージを使用して、出力を5の結果に制限します。

      • $project stageを次のように設定します。

        • titlereleasedを除くすべてのフィールドを除外します。

        • scoreという名前のフィールドを追加します。

    • クエリに一致するドキュメントをAggregateFlowインスタンスから出力します。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7import java.time.Instant
    8import java.util.*
    9
    10fun main() {
    11 // establish connection and set namespace
    12 val uri = "<connection-string>"
    13 val mongoClient = MongoClient.create(uri)
    14 val database = mongoClient.getDatabase("sample_mflix")
    15 val collection = database.getCollection<Document>("movies")
    16
    17 runBlocking {
    18 // define query
    19 val agg = Document(
    20 "\$search",
    21 Document("index", "sort-tutorial")
    22 .append(
    23 "compound",
    24 Document(
    25 "filter", listOf(
    26 Document(
    27 "wildcard",
    28 Document("query", "Summer*")
    29 .append("path", "title")
    30 )
    31 )
    32 )
    33 .append(
    34 "must", listOf(
    35 Document(
    36 "near",
    37 Document("pivot", 13149000000L)
    38 .append("path", "released")
    39 .append("origin", Date.from(Instant.parse("2014-04-18T00:00:00.000+00:00")))
    40 )
    41 )
    42 )
    43 )
    44 .append("sort", Document("released", -1))
    45 )
    46
    47 // run query and print results
    48 val resultsFlow = collection.aggregate<Document>(
    49 listOf(
    50 agg,
    51 limit(5),
    52 project(fields(
    53 excludeId(),
    54 include("title", "released"),
    55 computed("score", Document("\$meta", "searchScore"))
    56 ))
    57 )
    58 )
    59 resultsFlow.collect { println(it) }
    60 }
    61 mongoClient.close()
    62}
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. SortByDate.ktファイルを実行します。

    IDE でSortByDate.ktプログラムを実行すると、次のドキュメントが出力されます。

    Document{{title=Summer Nights, released=Tue Jan 27 19:00:00 EST 2015, score=0.348105788230896}}
    Document{{title=Summertime, released=Thu Jul 31 20:00:00 EDT 2014, score=0.5917375683784485}}
    Document{{title=Summer of Blood, released=Wed Apr 16 20:00:00 EDT 2014, score=0.9934720396995544}}
    Document{{title=Summer Games, released=Tue Feb 07 19:00:00 EST 2012, score=0.15982933342456818}}
    Document{{title=Summer of Goliath, released=Thu Jul 07 20:00:00 EDT 2011, score=0.13038821518421173}}
1
2

このコード例では、次のタスクを実行します。

  • MongoDB の Node.js ドライバーであるmongodbをインポートします。

  • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

  • 次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

    • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

    • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

      注意

      日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

    クエリは、次のパイプライン ステージを使用します。

    • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

    • $limitステージを使用して、出力を5の結果に制限します。

    • $project stageを次のように設定します。

      • titlereleasedを除くすべてのフィールドを除外します。

      • scoreという名前のフィールドを追加します。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1const { MongoClient } = require("mongodb");
2
3// Replace the uri string with your MongoDB deployments connection string.
4const uri =
5 "<connection-string>";
6
7const client = new MongoClient(uri);
8
9async function run() {
10 try {
11 await client.connect();
12
13 // set namespace
14 const database = client.db("sample_mflix");
15 const coll = database.collection("movies");
16
17 // define pipeline
18 const agg = [
19 {$search: {
20 index: "sort-tutorial",
21 compound: {
22 filter: {wildcard: {query: "Summer*", path: "title"}},
23 must: [{near: {path: "released", origin: new Date("2014-04-18T00:00:00.000Z"), pivot: 13149000000}}]
24 },
25 sort: { released: -1 }
26 }},
27 {$limit: 5},
28 {$project: {_id: 0, title: 1, released: 1, score: {$meta: "searchScore"}}}
29 ];
30
31 // run pipeline
32 const result = await coll.aggregate(agg);
33
34 // print results
35 await result.forEach((doc) => console.log(doc));
36
37 } finally {
38 await client.close();
39 }
40}
41run().catch(console.dir);

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
node sort-by-date.js
{
title: 'Summer Nights',
released: 2015-01-28T00:00:00.000Z,
score: 0.348105788230896
}
{
title: 'Summertime',
released: 2014-08-01T00:00:00.000Z,
score: 0.5917375683784485
}
{
title: 'Summer of Blood',
released: 2014-04-17T00:00:00.000Z,
score: 0.9934720396995544
}
{
title: 'Summer Games',
released: 2012-02-08T00:00:00.000Z,
score: 0.15982933342456818
}
{
title: 'Summer of Goliath',
released: 2011-07-08T00:00:00.000Z,
score: 0.13038821518421173
}
1
2

次のコード例では、次を行います。

  • pymongo、MongoDB の Python ドライバー、およびDNSシード リスト接続文字列を使用してpymongoAtlas に接続するために必要なdns モジュールをインポートします。

  • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

  • 次のクエリは、複合クエリを実行し、結果を日付フィールドでソートする方法を示しています。 次の演算子を使用します。

    • ワイルドカード演算子を使用すると、 Summerで始まる映画タイトルを検索できます。

    • near演算子を使用すると、2014 年 4 月 18 日の前後で公開された映画を検索できます。

      注意

      日付フィールドでpivotを使用する場合、その測定単位はミリ秒単位になります。 Atlas Search は、日付フィールドが指定された日付にどれだけ近いかに基づいて、各ドキュメントのスコアを計算します。 詳しくは、の近くを参照してください。

    クエリは、次のパイプライン ステージを使用します。

    • ステージでは、$search フィールドとtitle releasedフィールドを検索し、その結果を フィールドで降順にソートします。released

    • $limitステージを使用して、出力を5の結果に制限します。

    • $project stageを次のように設定します。

      • titlereleasedを除くすべてのフィールドを除外します。

      • scoreという名前のフィールドを追加します。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1import datetime
2import pymongo
3
4# connect to your Atlas cluster
5client = pymongo.MongoClient('<connection-string>')
6
7# define pipeline
8pipeline = [
9 {'$search': {
10 'index': 'sort-tutorial',
11 'compound': {
12 'filter': {'wildcard': {'query': 'Summer*', 'path': 'title'}},
13 'must': {'near': {
14 "path": "released",
15 "origin": datetime.datetime(2014, 4, 18, 0, 0, 0, 0),
16 "pivot": 13149000000
17 }}},
18 'sort': { 'released': -1 }}},
19 {'$limit': 5},
20 {'$project': {'_id': 0, 'title': 1, 'released': 1, 'score': {'$meta': 'searchScore'}}}
21]
22
23# run pipeline
24result = client['sample_mflix']['movies'].aggregate(pipeline)
25
26# print results
27for i in result:
28 print(i)

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
python sort-date-for-speed.py
{'title': 'Summer Nights', 'released': datetime.datetime(2015, 1, 28, 0, 0), 'score': 0.348105788230896}
{'title': 'Summertime', 'released': datetime.datetime(2014, 8, 1, 0, 0), 'score': 0.5917375683784485}
{'title': 'Summer of Blood', 'released': datetime.datetime(2014, 4, 17, 0, 0), 'score': 0.9934720396995544}
{'title': 'Summer Games', 'released': datetime.datetime(2012, 2, 8, 0, 0), 'score': 0.15982933342456818}
{'title': 'Summer of Goliath', 'released': datetime.datetime(2011, 7, 8, 0, 0), 'score': 0.13038821518421173}

サンプル クエリの$searchステージでは、 sort オプションを使用してAtlas Searchの結果をインデックス付きstringフィールドでソートします。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3

クエリするインデックスの右側にある [ Query ] ボタンをクリックします。

4

[ Edit Queryをクリックすると、 JSON形式のデフォルトのクエリ構文サンプルが表示されます。

5

次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorSearchボタンをクリックします。

[
{
$search: {
"index": "sort-tutorial",
"compound": {
"should": [{
"wildcard": {
"query": ["Prance*"],
"path": "title",
"allowAnalyzedField": true
}
},
{
"wildcard": {
"query": ["Prince*"],
"path": "title",
"allowAnalyzedField": true
}
}]
},
"sort": {
"title": 1
}
}
}
]
SCORE: 1 _id: "573a1398f29313caabceb98e"
plot: "A farm girl nurses a wounded reindeer she believes is one of Santa's, …"
genres: Array
runtime: 103
...
title: "Prancer"
...
SCORE: 1 _id: "573a13a5f29313caabd14f54"
plot: "Preteen brothers from a broken marriage live with their mother, Denise…"
genres: Array
runtime: 91
...
title: "Prancer Returns"
...
SCORE: 1 _id: "573a13f5f29313caabde3755"
plot: "A troubled teenager attempts to conquer the love of his life by becomi…"
genres: Array
runtime: 78
...
title: "Prince"
...
SCORE: 1 _id: "573a13d8f29313caabda665f"
fullplot: "Two highway road workers spend the summer of 1988 away from their city…"
imdb: Object
year: 2013
...
title: "Prince Avalanche"
...
SCORE: 1 _id: "573a13bdf29313caabd5898a"
plot: "A New York street drama about the lives of immigrants in America seeki…"
genres: Array
runtime: 70
...
title: "Prince of Broadway"
...
SCORE: 1 _id: "573a1398f29313caabcea967"
fullplot: "A sinister secret has been kept in the basement of an abandoned Los An…"
imdb: Object
year: 1987
...
title: "Prince of Darkness"
...
SCORE: 1 _id: "573a1393f29313caabcde40d"
plot: "An unscrupulous agent for the Borgias suffers a change of heart when a…"
genres: Array
runtime: 107
...
title: "Princess of Foxes"
...
SCORE: 1 _id: "573a13b5f29313caabd43816"
plot: "A young fugitive prince and princess must stop a villain who unknowing…"
genres: Array
runtime: 116
...
title: "Prince of Persia: The Sands of Time"
...
SCORE: 1 _id: "573a1397f29313caabce8081"
plot: "A New York City narcotics detective reluctantly agrees to cooperate wi…"
genres: Array
runtime: 167
...
title: "Prince of the City"
...
SCORE: 1 _id: "573a13a2f29313caabd0a767"
plot: "Six old-style funny silhouetted fairy tales for not so-old-style peopl…"
genres: Array
runtime: 70
...
title: "Princes and Princesses"
...

Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

6

Search Testerでは、返されるドキュメント内のすべてのフィールドが表示されない場合があります。 クエリパスで指定したフィールドを含むすべてのフィールドを表示するには、結果内のドキュメントを展開します。

1

ターミナル ウィンドウでmongoshを開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh経由での接続 」を参照してください。

2

mongoshプロンプトで次のコマンドを実行します。

use sample_mflix
3

次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

クエリは、次のパイプライン ステージを使用します。

  • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

  • $limitステージを使用して、出力を5の結果に制限します。

  • $project stageを次のように設定します。

    • titleを除くすべてのフィールドを除外します。

    • scoreという名前のフィールドを追加します。

1db.movies.aggregate([{
2 $search: {
3 "index": "sort-tutorial",
4 "compound": {
5 "should": [{
6 "wildcard": {
7 "query": ["Prance*"],
8 "path": "title",
9 "allowAnalyzedField": true
10 }
11 },
12 {
13 "wildcard": {
14 "query": ["Prince*"],
15 "path": "title",
16 "allowAnalyzedField": true
17 }
18 }]
19 },
20 "sort": {
21 "title": 1
22 }
23 }},
24 {
25 $limit: 5
26 },
27 {
28 $project: {
29 "_id": 0,
30 "title": 1,
31 "score": { "$meta": "searchScore" }
32 }
33 }
34])
[
{ title: 'Prancer', score: 1 },
{ title: 'Prancer Returns', score: 1 },
{ title: 'Prince', score: 1 },
{ title: 'Prince Avalanche', score: 1 },
{ title: 'Prince of Broadway', score: 1 }
]

Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1

MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。

2

Database画面で、 sample_mflixデータベースをクリックし、 moviesコレクションをクリックします。

3

次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

クエリは、次のパイプライン ステージを使用します。

  • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

  • $limitステージを使用して、出力を5の結果に制限します。

  • $project stageを次のように設定します。

    • titleを除くすべてのフィールドを除外します。

    • scoreという名前のフィールドを追加します。

MongoDB Compass でこのクエリを実行するには:

  1. [Aggregations] タブをクリックします。

  2. Select...をクリックし、ドロップダウンからステージを選択し、そのステージのクエリを追加して、次の各パイプライン ステージを構成します。 ステージを追加するには、 Add Stageをクリックします。

    パイプラインステージ
    クエリ
    $search
    {
    index: "sort-tutorial",
    compound: {
    should: [{
    wildcard: {
    query: "Prance*",
    path: 'title',
    allowAnalyzedField: true
    }},
    {
    wildcard: {
    query: "Prince*",
    path: 'title',
    allowAnalyzedField: true
    }
    }]
    },
    sort: {
    title: 1
    }
    }
    $limit
    5
    $project
    {
    _id: 0,
    title: 1,
    score: { $meta: "searchScore" }
    }

    Auto Previewを有効にした場合、MongoDB Compass は$projectパイプライン ステージの横に次のドキュメントを表示します。

    {
    title: 'Prancer',
    score: 1
    },
    {
    title: 'Prancer Returns',
    score: 1
    },
    {
    title: 'Prince',
    score: 1
    },
    {
    title: 'Prince Avalanche',
    score: 1
    },
    {
    title: 'Prince of Boradway',
    score: 1
    }

    Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1
  1. sort-by-strings-example という新しいディレクトリを作成し、dotnet new コマンドでプロジェクトを初期化します。

    mkdir sort-by-strings-example
    cd sort-by-strings-example
    dotnet new console
  2. .NET/C# ドライバーを依存関係としてプロジェクトに追加します。

    dotnet add package MongoDB.Driver
2
  1. Program.cs ファイルの内容を、次のコードで置き換えます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

      クエリは、次のパイプライン ステージを使用します。

      • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

      • $limitステージを使用して、出力を5の結果に制限します。

      • $project stageを次のように設定します。

        • titleを除くすべてのフィールドを除外します。

        • scoreという名前のフィールドを追加します。

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public class SortByStrings
    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 MovieDocument
    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 mflixDatabase = mongoClient.GetDatabase("sample_mflix");
    20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies");
    21
    22 // define search options
    23 var searchOptions = new SearchOptions<MovieDocument>()
    24 {
    25 Sort = Builders<MovieDocument>.Sort.Ascending(movie => movie.Title),
    26 IndexName = "sort-tutorial"
    27 };
    28
    29 // define and run pipeline
    30 var results = moviesCollection.Aggregate()
    31 .Search(Builders<MovieDocument>.Search.Compound()
    32 .Should(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Prance*", true ))
    33 .Should(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Prince*" )), searchOptions)
    34 .Project<MovieDocument>(Builders<MovieDocument>.Projection
    35 .Include(movie => movie.Title)
    36 .Exclude(movie => movie.Id)
    37 .MetaSearchScore(movie => movie.Score))
    38 .Limit(5)
    39 .ToList();
    40
    41 // print results
    42 foreach (var movie in results)
    43 {
    44 Console.WriteLine(movie.ToJson());
    45 }
    46 }
    47}
    48
    49[BsonIgnoreExtraElements]
    50public class MovieDocument
    51{
    52 [BsonIgnoreIfDefault]
    53 public ObjectId Id { get; set; }
    54 public string Title { get; set; }
    55 public double Score { get; set; }
    56}
  2. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
dotnet run Program.cs
{ "title" : "Prancer", "score" : 1.0 }
{ "title" : "Prancer Returns", "score" : 1.0 }
{ "title" : "Prince", "score" : 1.0 }
{ "title" : "Prince Avalanche", "score" : 1.0 }
{ "title" : "Prince of Broadway", "score" : 1.0 }

Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1
2

このコード例では、次のタスクを実行します。

  • mongodb パッケージと依存関係をインポートします。

  • Atlas クラスターへの接続を確立します。

  • 次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

    クエリは、次のパイプライン ステージを使用します。

    • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

    • $limitステージを使用して、出力を5の結果に制限します。

    • $project stageを次のように設定します。

      • titleを除くすべてのフィールドを除外します。

      • scoreという名前のフィールドを追加します。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1package main
2
3import (
4 "context"
5 "fmt"
6
7 "go.mongodb.org/mongo-driver/bson"
8 "go.mongodb.org/mongo-driver/mongo"
9 "go.mongodb.org/mongo-driver/mongo/options"
10)
11
12func main() {
13 // connect to your Atlas cluster
14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
15 if err != nil {
16 panic(err)
17 }
18 defer client.Disconnect(context.TODO())
19
20 // set namespace
21 collection := client.Database("sample_mflix").Collection("movies")
22
23 // define pipeline stages
24 searchStage := bson.D{{"$search", bson.M{
25 "index": "sort-tutorial",
26 "compound": bson.M{
27 "should": bson.A{
28 bson.M{
29 "wildcard": bson.D{
30 {"path", "title"},
31 {"query", "Prance*"},
32 {"allowAnalyzedField", true},
33 }},
34 bson.M{
35 "wildcard": bson.D{
36 {"path", "title"},
37 {"query", "Prince*"},
38 {"allowAnalyzedField", true},
39 }},
40 },
41 },
42 "sort": bson.D{{"title", 1}},
43 }}}
44
45 limitStage := bson.D{{"$limit", 5}}
46 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
47
48 // run pipeline
49 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
50 if err != nil {
51 panic(err)
52 }
53
54 // print results
55 var results []bson.D
56 if err = cursor.All(context.TODO(), &results); err != nil {
57 panic(err)
58 }
59 for _, result := range results {
60 fmt.Println(result)
61 }
62}

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
go run sort-by-strings.go
[{title Prancer} {score 1}]
[{title Prancer Returns} {score 1}]
[{title Prince} {score 1}]
[{title Prince Avalanche} {score 1}]
[{title Prince of Broadway} {score 1}]

Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1
junit
4.11以降のバージョン
mongodb-driver-sync
4.3.0以降のバージョン
slf4j-log4j12
1.7.30以降のバージョン
2
  1. SortByString.javaという名前のファイルを作成します。

  2. 次のコードをコピーして、 SortByString.javaファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

      クエリは、次のパイプライン ステージを使用します。

      • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

      • $limitステージを使用して、出力を5の結果に制限します。

      • $project stageを次のように設定します。

        • titleを除くすべてのフィールドを除外します。

        • scoreという名前のフィールドを追加します。

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1import java.util.Arrays;
    2import java.util.List;
    3
    4import static com.mongodb.client.model.Aggregates.limit;
    5import static com.mongodb.client.model.Aggregates.project;
    6import static com.mongodb.client.model.Projections.*;
    7import com.mongodb.client.MongoClient;
    8import com.mongodb.client.MongoClients;
    9import com.mongodb.client.MongoCollection;
    10import com.mongodb.client.MongoDatabase;
    11import org.bson.Document;
    12
    13import java.util.Date;
    14
    15public class SortByString {
    16 public static void main( String[] args ) {
    17 // define clause
    18 List<Document> shouldClause =
    19 List.of(
    20 new Document(
    21 "wildcard",
    22 new Document("query", "Prance*")
    23 .append("path", "title")
    24 .append("allowAnalyzedField", true)),
    25 new Document(
    26 "wildcard",
    27 new Document("query", "Prince*")
    28 .append("path", "title")
    29 .append("allowAnalyzedField", true)));
    30
    31 // define query
    32 Document agg =
    33 new Document(
    34 "$search",
    35 new Document("index", "sort-tutorial")
    36 .append("compound",
    37 new Document("should", shouldClause))
    38 .append("sort", new Document("title", 1L)));
    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("sample_mflix");
    46 MongoCollection<Document> collection = database.getCollection("movies");
    47
    48 // run query and print results
    49 collection.aggregate(Arrays.asList(agg,
    50 limit(5),
    51 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore"))))))
    52 .forEach(doc -> System.out.println(doc.toJson()));
    53 }
    54 }
    55}

    注意

    Maven 環境でサンプル コードを実行するには、 ファイルのインポート ステートメントの上に次のコードを追加します。

    package com.mongodb.drivers;
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. SortByString.javaファイルをコンパイルして実行します。

    javac SortByString.java
    java SortByString
    {"title": "Prancer", "score": 1.0}
    {"title": "Prancer Returns", "score": 1.0}
    {"title": "Prince", "score": 1.0}
    {"title": "Prince Avalanche", "score": 1.0}
    {"title": "Prince of Broadway", "score": 1.0}

    Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1
mongodb-driver-kotlin-coroutine
4.10.0以降のバージョン
2
  1. SortByString.ktという名前のファイルを作成します。

  2. 次のコードをコピーして、 SortByString.ktファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

      クエリは、次のパイプライン ステージを使用します。

      • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

      • $limitステージを使用して、出力を5の結果に制限します。

      • $project stageを次のように設定します。

        • titleを除くすべてのフィールドを除外します。

        • scoreという名前のフィールドを追加します。

    • クエリに一致するドキュメントをAggregateFlowインスタンスから出力します。

    1import com.mongodb.client.model.Aggregates.limit
    2import com.mongodb.client.model.Aggregates.project
    3import com.mongodb.client.model.Projections.*
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.runBlocking
    6import org.bson.Document
    7
    8fun main() {
    9 // establish connection and set namespace
    10 val uri = "<connection-string>"
    11 val mongoClient = MongoClient.create(uri)
    12 val database = mongoClient.getDatabase("sample_mflix")
    13 val collection = database.getCollection<Document>("movies")
    14
    15 runBlocking {
    16 // define clause
    17 val shouldClause = listOf(
    18 Document("wildcard", Document("query", "Prance*")
    19 .append("path", "title")
    20 .append("allowAnalyzedField", true)),
    21 Document("wildcard", Document("query", "Prince*")
    22 .append("path", "title")
    23 .append("allowAnalyzedField", true))
    24 )
    25
    26 // define query
    27 val agg = Document(
    28 "\$search",
    29 Document("index", "sort-tutorial")
    30 .append(
    31 "compound",
    32 Document("should", shouldClause)
    33 )
    34 .append("sort", Document("title", 1L))
    35 )
    36
    37 // run query and print results
    38 val resultsFlow = collection.aggregate<Document>(
    39 listOf(
    40 agg,
    41 limit(5),
    42 project(fields(
    43 excludeId(),
    44 include("title"),
    45 computed("score", Document("\$meta", "searchScore"))
    46 ))
    47 )
    48 )
    49 resultsFlow.collect { println(it) }
    50 }
    51 mongoClient.close()
    52}
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. SortByString.ktファイルを実行します。

    IDE でSortByString.ktプログラムを実行すると、次のドキュメントが出力されます。

    Document{{title=Prancer, score=1.0}}
    Document{{title=Prancer Returns, score=1.0}}
    Document{{title=Prince, score=1.0}}
    Document{{title=Prince Avalanche, score=1.0}}
    Document{{title=Prince of Broadway, score=1.0}}

    Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1
2

このコード例では、次のタスクを実行します。

  • MongoDB の Node.js ドライバーであるmongodbをインポートします。

  • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

  • 次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

    クエリは、次のパイプライン ステージを使用します。

    • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

    • $limitステージを使用して、出力を5の結果に制限します。

    • $project stageを次のように設定します。

      • titleを除くすべてのフィールドを除外します。

      • scoreという名前のフィールドを追加します。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1const { MongoClient } = require("mongodb");
2
3// Replace the uri string with your MongoDB deployments connection string.
4const uri =
5 "<connection-string>";
6
7const client = new MongoClient(uri);
8
9async function run() {
10 try {
11 await client.connect();
12
13 // set namespace
14 const database = client.db("sample_mflix");
15 const coll = database.collection("movies");
16
17 // define pipeline
18 const agg = [
19 {
20 '$search': {
21 'index': 'sort-tutorial',
22 'compound': {
23 'should': [
24 {
25 'wildcard': {
26 'query': [
27 'Prance*'
28 ],
29 'path': 'title',
30 'allowAnalyzedField': true
31 }
32 }, {
33 'wildcard': {
34 'query': [
35 'Prince*'
36 ],
37 'path': 'title',
38 'allowAnalyzedField': true
39 }
40 }
41 ]
42 },
43 'sort': { 'title': 1 }
44 }
45 }, {
46 '$limit': 5
47 }, {
48 '$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'}
49 }
50 }
51 ];
52
53 // run pipeline
54 const result = await coll.aggregate(agg);
55
56 // print results
57 await result.forEach((doc) => console.log(doc));
58
59 } finally {
60 await client.close();
61 }
62}
63run().catch(console.dir);

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
node sort-by-strings.js
{ title: 'Prancer', score: 1 }
{ title: 'Prancer Returns', score: 1 }
{ title: 'Prince', score: 1 }
{ title: 'Prince Avalanche', score: 1 }
{ title: 'Prince of Broadway', score: 1 }

Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

1
2

次のコード例では、次を行います。

  • pymongo、MongoDB の Python ドライバー、およびDNSシード リスト接続文字列を使用してpymongoAtlas に接続するために必要なdns モジュールをインポートします。

  • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

  • 次のクエリは、結果を string フィールドでクエリしてソートする方法を示しています。 PranceまたはPrinceで始まるタイトルを検索し、結果をtitleフィールドで昇順にソートします。

    クエリは、次のパイプライン ステージを使用します。

    • $searchは、ワイルドカード演算子とともにshould句を使用してtitleフィールドを検索し、 PrancePrinceで始まるタイトルを検索します。 このクエリでは、結果がtitleフィールドで昇順にソートされる必要があることも指定しています。

    • $limitステージを使用して、出力を5の結果に制限します。

    • $project stageを次のように設定します。

      • titleを除くすべてのフィールドを除外します。

      • scoreという名前のフィールドを追加します。

  • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

1import datetime
2import pymongo
3
4# connect to your Atlas cluster
5client = pymongo.MongoClient('<connection-string>')
6
7# define pipeline
8pipeline = [
9 {'$search': {
10 'index': 'sort-tutorial',
11 'compound': {
12 'should': [{'wildcard': {'query': 'Prance*', 'path': 'title', 'allowAnalyzedField': True}},
13 {'wildcard': {'query': 'Prince*', 'path': 'title', 'allowAnalyzedField': True}}]
14 },
15 'sort': { 'title': 1 }}},
16 {'$limit': 5},
17 {'$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'}}}
18]
19
20# run pipeline
21result = client['sample_mflix']['movies'].aggregate(pipeline)
22
23# print results
24for i in result:
25 print(i)

注意

サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
python sort-by-strings.py
{'title': 'Prancer', 'score': 1.0}
{'title': 'Prancer Returns', 'score': 1.0}
{'title': 'Prince', 'score': 1.0}
{'title': 'Prince Avalanche', 'score': 1.0}
{'title': 'Prince of Broadway', 'score': 1.0}

Atlas Search 結果には、 PrancePrinceで始まる映画タイトルが含まれているドキュメントが含まれています。 Atlas Search Atlas Search title フィールドで昇順にドキュメントをソートするため、Prance の後に Prince が続くタイトルを返します。

サンプル クエリの$searchステージでは、ソートオプションを使用して、ソートされたフィールド値の大文字と小文字を区別せずに Atlas Search の結果をソートします。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの Clusters をクリックしてください。

    [ Clusters (クラスター) ] ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3

クエリするインデックスの右側にある [ Query ] ボタンをクリックします。

4

[ Edit Queryをクリックすると、 JSON形式のデフォルトのクエリ構文サンプルが表示されます。

5

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

[
{
"$search": {
"index": "sort-tutorial",
"text": {
"path": "title",
"query": "train",
},
"sort": {
"title": 1
}
}
}
]
SCORE: 3.317898988723755 _id: "573a139cf29313caabcf662c"
plot: "A train filled with atomic devices threatens to destroy the city of De…"
genres: Array
runtime: 122
SCORE: 3.317898988723755 _id: "64de50ae2932de4dd3203061"
genres: Array
title: "atomic train"
awards: Object
SCORE: 2.228306293487549 _id: "573a13bbf29313caabd52ff4"
fullplot: "Long ago up North on the Island of Berk, the young Viking, Hiccup, wan…"
imdb: Object
year: 2010
SCORE: 2.228306293487549 _id: "64de50da2932de4dd3204393"
genres: Array
title: "how to train your dragon"
awards: Object
SCORE: 2.008449077606201 _id: "573a13ccf29313caabd83281"
plot: "When Hiccup and Toothless discover an ice cave that is home to hundred…"
genres: Array
runtime: 102
SCORE: 1.4400973320007324 _id: "573a13b1f29313caabd36490"
plot: "The life and times of Howard Zinn: the historian, activist, and author…"
genres: Array
runtime: 78
SCORE: 2.228306293487549 _id: "573a1394f29313caabce0fb4"
plot: "A marshal tries to bring the son of an old friend, an autocratic cattl…"
genres: Array
runtime: 95
SCORE: 2.8528976440429688 _id: "573a13c8f29313caabd78a6b"
plot: "A couple embarks on a journey home for Chinese new year along with 130…"
genres: Array
runtime: 85
SCORE: 2.502213716506958 _id: "573a13baf29313caabd50811"
plot: "Two thugs from the Perth suburb of Midland catch the last train to Fre…"
genres: Array
runtime: 89
SCORE: 2.502213716506958 _id: "573a13a7f29313caabd1b667"
fullplot: "A teacher and a gangster meet by chance in a small town pharmacy. As a…"
imdb: Object
year: 2002

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

SCORE: 3.317898988723755 _id: "573a139cf29313caabcf662c"
plot: "A train filled with atomic devices threatens to destroy the city of De…"
genres: Array
runtime: 122
SCORE: 2.2382168769836426 _id: "573a13bbf29313caabd52ff4"
fullplot: "Long ago up North on the Island of Berk, the young Viking, Hiccup, wan…"
imdb: object
year: 2010
SCORE: 2.008449077606201 _id: "573a13ccf29313caabd83281"
plot: "When Hiccup and Toothless discover an ice cave that is home to hundred…"
genres: Array
runtime: 102
SCORE: 1.4400973320007324 _id: "573a13b1f29313caabd36490"
plot: "The life and times of Howard Zinn: the historian, activist, and author…"
genres: Array
runtime: 78
SCORE: 2.8528976440429688 _id: "573a13c8f29313caabd78a6b"
plot: "A couple embarks on a journey home for Chinese new year along with 130…"
genres: Array
runtime: 85
SCORE: 2.228306293487549 _id: "573a1394f29313caabce0fb4"
plot: "A marshal tries to bring the son of an old friend, an autocratic cattl…"
genres: Array
runtime: 95
SCORE: 2.502213716506958 _id: "573a13baf29313caabd50811"
plot: "Two thugs from the Perth suburb of Midland catch the last train to Fre…"
genres: Array
runtime: 89
SCORE: 2.502213716506958 _id: "573a13a7f29313caabd1b667"
fullplot: "A teacher and a gangster meet by chance in a small town pharmacy. As a…"
imdb: Object
year: 2002
SCORE: 3.3326687812805176 _id: "573a139af29313caabcef573"
plot: "A vengeful New York transit cop decides to steal a trainload of subway…"
genres: Array
runtime: 110
SCORE: 3.3326687812805176 _id: "573a1398f29313caabceb8f2"
plot: "Three stories are connected by a Memphis hotel and the spirit of Elvis…"
genres: Array
runtime: 110

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

6

Search Testerでは、返されるドキュメント内のすべてのフィールドが表示されない場合があります。 クエリパスで指定したフィールドを含むすべてのフィールドを表示するには、結果内のドキュメントを展開します。

1

ターミナル ウィンドウでmongoshを開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh 経由での接続 」を参照してください。

2
use sample_mflix
switched to db sample_mflix
3

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

db.movies.aggregate(
{
"$search": {
"index": "case-insensitive-sort",
"text": {
"path": "title",
"query": "train",
},
"sort": {
"title": 1
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 1,
"title": 1,
"awards": 1,
"score": { $meta: "searchScore" }
}
}
)
[
{
_id: ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.317898988723755
},
{
_id: ObjectId("64de50ae2932de4dd3203061"),
title: 'atomic train',
awards: { wins: 1, nominations: 1 },
score: 3.317898988723755
},
{
_id: ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.228306293487549
},
{
_id: ObjectId("64de50da2932de4dd3204393"),
title: 'how to train your dragon',
awards: { wins: 32, nominations: 51 },
score: 2.228306293487549
},
{
_id: ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.008449077606201
}
]

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

[
{
_id: ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.3326687812805176
},
{
_id: ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.2382168769836426
},
{
_id: ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.0173802375793457
},
{
_id: ObjectId("573a13b1f29313caabd36490"),
title: "Howard Zinn: You Can't Be Neutral on a Moving Train",
awards: { wins: 1, nominations: 0, text: '1 win.' },
score: 1.446497917175293
},
{
_id: ObjectId("573a13c8f29313caabd78a6b"),
title: 'Last Train Home',
awards: { wins: 14, nominations: 9, text: '14 wins & 9 nominations.' },
score: 2.8655927181243896
}
]

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

1

MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。

2

Database画面で、 sample_mflixデータベースをクリックし、 moviesコレクションをクリックします。

3

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

MongoDB Compass でこのクエリを実行するには:

  1. [Aggregations] タブをクリックします。

  2. Select...をクリックし、ドロップダウンからステージを選択し、そのステージのクエリを追加して、次の各パイプライン ステージを構成します。 ステージを追加するには、 Add Stageをクリックします。

    パイプラインステージ
    クエリ
    $search
    {
    "index": "case-insensitive-sort",
    "text": {
    "path": "title",
    "query": "train",
    },
    "sort": {
    "title": 1,
    }
    }
    $limit
    5
    $project
    {
    "_id": 1,
    "title": 1,
    "awards": 1,
    "score": { $meta: "searchScore" }
    }

    Auto Preview有効にした場合、MongoDB Compass は$projectパイプライン ステージの横に次のドキュメントを表示します。

    _id: ObjectId('573a139cf29313caabcf662c')
    title: 'Atomic Train'
    awards: Object
    score: 3.317898988723755
    _id: ObjectId("64de50ae2932de4dd3203061")
    title: 'atomic train'
    awards: Object
    score: 3.317898988723755
    _id: ObjectId('573a13bbf29313caabd52ff4')
    title: 'How to Train Your Dragon'
    awards: Object
    score: 2.228306293487549
    _id: ObjectId("64de50da2932de4dd3204393"),
    title: 'how to train your dragon'
    awards:
    score: 2.228306293487549
    _id: ObjectId('573a13ccf29313caabd83281')
    title: 'How to Train Your Dragon 2'
    awards: object
    score: 2.0173802375793457

    結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

    _id: ObjectId('573a139cf29313caabcf662c')
    title: 'Atomic Train'
    awards: Object
    score: 3.317898988723755
    _id: ObjectId('573a13bbf29313caabd52ff4')
    title: 'How to Train Your Dragon'
    awards: Object
    score: 2.228306293487549
    _id: ObjectId('573a13ccf29313caabd83281')
    title: 'How to Train Your Dragon 2'
    awards:
    score: 2.0173802375793457
    _id: ObjectId('573a13b1f29313caabd36490')
    title: 'Howard Zinn: You Can't Be Neutral on a Moving Train'
    awards: Object
    score: 1.446497917175293
    _id: ObjectId('573a13c8f29313caabd78a6b')
    title: 'Last Train Home'
    awards: Object
    score: 2.8655927181243896

    大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

4

MongoDB Compass では、結果で返されるドキュメントの、オブジェクト内のすべてのフィールドと配列内のすべての値が表示されない場合があります。 すべてのフィールドと値を表示するには、結果内の フィールドを展開します。

1
  1. case-insensitive-sort という新しいディレクトリを作成し、dotnet new コマンドでプロジェクトを初期化します。

    mkdir case-insensitive-sort
    cd case-insensitive-sort
    dotnet new console
  2. .NET/C# ドライバーを依存関係としてプロジェクトに追加します。

    dotnet add package MongoDB.Driver
2

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.Search;
6
7public class CaseInsensitiveSort
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 MovieDocument
14 var camelCaseConvention = new ConventionPack { new camelCaseConvention() };
15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
16
17 // connect to your Atlas cluster
18 var mongoClient = new MongoClient(MongoConnectionString);
19 var yourDatabase = mongoClient.GetDatabase("sample_mflix");
20 var moviesCollection = yourDatabase.GetCollection<MovieDocument>("movies");
21
22 // define options for search
23 var searchOptions = new SearchOptions<MovieDocument>() {
24 Sort = Builders<MovieDocument>.Sort.Ascending(movie => movie.Title),
25 IndexName = "case-insensitive-sort"
26 };
27
28 // define and run pipeline
29 var results = moviesCollection.Aggregate()
30 .Search(Builders<MovieDocument>.Search.Text(movie => movie.Title, "train"), searchOptions)
31 .Limit (5)
32 .Project<MovieDocument>(Builders<MovieDocument>.Projection
33 .Include(movie => movie.Id)
34 .Include(movie => movie.Title)
35 .Include(movie => movie.Awards)
36 .MetaSearchScore(movie => movie.Score))
37 .ToList();
38
39 // print results
40 foreach (var movie in results)
41 {
42 Console.WriteLine(movie.ToJson());
43 }
44 }
45}
46
47[BsonIgnoreExtraElements]
48public class MovieDocument
49{
50 [BsonIgnoreIfDefault]
51 public ObjectId Id { get; set; }
52 public string Title { get; set; }
53 public Award Awards { get; set; }
54 public double Score { get; set; }
55}
56
57[BsonIgnoreExtraElements]
58public class Award
59{
60 public int Wins { get; set; }
61 public int Nominations { get; set; }
62}
3

接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

4
dotnet run case-insensitive-sort.csproj
{ "_id" : ObjectId("573a139cf29313caabcf662c"), "title" : "Atomic Train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035578727722168 }
{ "_id" : ObjectId("64de50ae2932de4dd3203061"), "title" : "atomic train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035578727722168 }
{ "_id" : ObjectId("573a13bbf29313caabd52ff4"), "title" : "How to Train Your Dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186923027038574 }
{ "_id" : ObjectId("64de50da2932de4dd3204393"), "title" : "how to train your dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186923027038574 }
{ "_id" : ObjectId("573a13ccf29313caabd83281"), "title" : "How to Train Your Dragon 2", "awards" : { "wins" : 18, "nominations" : 52 }, "score" : 1.9997868537902832 }

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

{ "_id" : ObjectId("573a139cf29313caabcf662c"), "title" : "Atomic Train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035225868225098 }
{ "_id" : ObjectId("573a13bbf29313caabd52ff4"), "title" : "How to Train Your Dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186522483825684 }
{ "_id" : ObjectId("573a13ccf29313caabd83281"), "title" : "How to Train Your Dragon 2", "awards" : { "wins" : 18, "nominations" : 52 }, "score" : 1.9997482299804688 }
{ "_id" : ObjectId("573a13b1f29313caabd36490"), "title" : "Howard Zinn: You Can't Be Neutral on a Moving Train", "awards" : { "wins" : 1, "nominations" : 0 }, "score" : 1.4338588714599609 }
{ "_id" : ObjectId("573a13c8f29313caabd78a6b"), "title" : "Last Train Home", "awards" : { "wins" : 14, "nominations" : 9 }, "score" : 2.8405368328094482 }

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

1
2

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

1package main
2
3import (
4 "context"
5 "fmt"
6
7 "go.mongodb.org/mongo-driver/bson"
8 "go.mongodb.org/mongo-driver/mongo"
9 "go.mongodb.org/mongo-driver/mongo/options"
10)
11
12func main() {
13 // connect to your Atlas cluster
14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>"))
15 if err != nil {
16 panic(err)
17 }
18 defer client.Disconnect(context.TODO())
19
20 // set namespace
21 collection := client.Database("sample_mflix").Collection("movies")
22
23 // define pipeline stages
24 searchStage := bson.D{{"$search", bson.M{
25 "index": "case-insensitive-sort",
26 "text": bson.D{
27 {"path", "title"},
28 {"query", "train"},
29 },
30 "sort": bson.D{{"title", 1}},
31 }}}
32 limitStage := bson.D{{"$limit", 5}}
33 projectStage := bson.D{{"$project", bson.D{{"_id", 1}, {"title", 1}, {"awards", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
34
35 // run pipeline
36 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage,projectStage})
37 if err != nil {
38 panic(err)
39 }
40
41 // print results
42 var results []bson.D
43 if err = cursor.All(context.TODO(), &results); err != nil {
44 panic(err)
45 }
46 for _, result := range results {
47 fmt.Println(result)
48 }
49}
3
  • <connection-string> (行 14)をAtlas接続文字列と置き換え。 接続文字列にデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  • <database-name> (行21 )を、コレクションを追加したデータベースの名前に置き換えます。

4
go run case-insensitive-query.go
[{_id ObjectID("573a139cf29313caabcf662c")} {title Atomic Train} {awards [{wins 1} {nominations 1} {text 1 win & 1 nomination.}]} {score 3.317898988723755}]
[{_id ObjectId("64de50ae2932de4dd3203061")} {title atomic train} {awards [{wins 1} {nominations 1}]} {score 3.317898988723755}]
[{_id ObjectID("573a13bbf29313caabd52ff4")} {title How to Train Your Dragon} {awards [{wins 32} {nominations 51} {text Nominated for 2 Oscars. Another 30 wins & 51 nominations.}]} {score 2.228306293487549}]
[{_id ObjectId("64de50da2932de4dd3204393")} {title how to train your dragon} {awards [{wins 32} {nominations 51}]} {score 2.228306293487549}]
[{_id ObjectID("573a13ccf29313caabd83281")} {title How to Train Your Dragon 2} {awards [{wins 18} {nominations 52} {text Nominated for 1 Oscar. Another 17 wins & 52 nominations.}]} {score 2.008449077606201}]

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

[{_id ObjectID("573a139cf29313caabcf662c")} {title Atomic Train} {awards [{wins 1} {nominations 1} {text 1 win & 1 nomination.}]} {score 3.3326687812805176}]
[{_id ObjectID("573a13bbf29313caabd52ff4")} {title How to Train Your Dragon} {awards [{wins 32} {nominations 51} {text Nominated for 2 Oscars. Another 30 wins & 51 nominations.}]} {score 2.2382168769836426}]
[{_id ObjectID("573a13ccf29313caabd83281")} {title How to Train Your Dragon 2} {awards [{wins 18} {nominations 52} {text Nominated for 1 Oscar. Another 17 wins & 52 nominations.}]} {score 2.0173802375793457}]
[{_id ObjectID("573a13b1f29313caabd36490")} {title Howard Zinn: You Can't Be Neutral on a Moving Train} {awards [{wins 1} {nominations 0} {text 1 win.}]} {score 1.446497917175293}]
[{_id ObjectID("573a13c8f29313caabd78a6b")} {title Last Train Home} {awards [{wins 14} {nominations 9} {text 14 wins & 9 nominations.}]} {score 2.8655927181243896}]

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

1
junit
4.11以降のバージョン
mongodb-driver-sync
4.3.0以降のバージョン
slf4j-log4j12
1.7.30以降のバージョン
2
3

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.*;
5import com.mongodb.client.MongoClient;
6import com.mongodb.client.MongoClients;
7import com.mongodb.client.MongoCollection;
8import com.mongodb.client.MongoDatabase;
9import org.bson.Document;
10
11public class CaseInsensitiveQuery {
12 public static void main( String[] args ) {
13 // define query
14 Document agg =
15 new Document("$search",
16 new Document("index", "case-insensitive-sort")
17 .append("text",
18 new Document("path", "title")
19 .append("query", "train"))
20 .append("sort",
21 new Document("title", 1)));
22
23 // specify connection
24 String uri = "<connection-string>";
25
26 // establish connection and set namespace
27 try (MongoClient mongoClient = MongoClients.create(uri)) {
28 MongoDatabase database = mongoClient.getDatabase("sample_mflix");
29 MongoCollection<Document> collection = database.getCollection("movies");
30
31 // run query and print results
32 collection.aggregate(Arrays.asList(agg,
33 limit(5),
34 project(fields(include("_id"), include("title"), include("awards"), computed("score", new Document("$meta", "searchScore"))))))
35 .forEach(doc -> System.out.println(doc.toJson()));
36 }
37 }
38}
4

接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

5
javac CaseInsensitiveQuery.java
java CaseInsensitiveQuery
{"_id": {"$oid": "573a139cf29313caabcf662c"}, "title": "Atomic Train", "awards": {"wins": 1, "nominations": 1, "text": "1 win & 1 nomination."}, "score": 3.317898988723755}
{"_id": {"$oid": "64de50ae2932de4dd3203061"}, "title": "atomic train", "awards": {"wins": 1, "nominations": 1}, "score": 3.317898988723755}
{"_id": {"$oid": "573a13bbf29313caabd52ff4"}, "title": "How to Train Your Dragon", "awards": {"wins": 32, "nominations": 51, "text": "Nominated for 2 Oscars. Another 30 wins & 51 nominations."}, "score": 2.228306293487549}
{"_id": {"$oid": "64de50da2932de4dd3204393"}, "title": "how to train your dragon", "awards": {"wins": 32, "nominations": 51}, "score": 2.228306293487549}
{"_id": {"$oid": "573a13ccf29313caabd83281"}, "title": "How to Train Your Dragon 2", "awards": {"wins": 18, "nominations": 52, "text": "Nominated for 1 Oscar. Another 17 wins & 52 nominations."}, "score": 2.008449077606201}

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

{"_id": {"$oid": "573a139cf29313caabcf662c"}, "title": "Atomic Train", "awards": {"wins": 1, "nominations": 1, "text": "1 win & 1 nomination."}, "score": 3.3326687812805176}
{"_id": {"$oid": "573a13bbf29313caabd52ff4"}, "title": "How to Train Your Dragon", "awards": {"wins": 32, "nominations": 51, "text": "Nominated for 2 Oscars. Another 30 wins & 51 nominations."}, "score": 2.2382168769836426}
{"_id": {"$oid": "573a13ccf29313caabd83281"}, "title": "How to Train Your Dragon 2", "awards": {"wins": 18, "nominations": 52, "text": "Nominated for 1 Oscar. Another 17 wins & 52 nominations."}, "score": 2.0173802375793457}
{"_id": {"$oid": "573a13b1f29313caabd36490"}, "title": "Howard Zinn: You Can't Be Neutral on a Moving Train", "awards": {"wins": 1, "nominations": 0, "text": "1 win."}, "score": 1.446497917175293}
{"_id": {"$oid": "573a13c8f29313caabd78a6b"}, "title": "Last Train Home", "awards": {"wins": 14, "nominations": 9, "text": "14 wins & 9 nominations."}, "score": 2.8655927181243896}

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

1
mongodb-driver-kotlin-coroutine
4.10.0以降のバージョン
2
3

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_mflix")
13 val collection = database.getCollection<Document>("movies")
14
15 runBlocking {
16 // define query
17 val agg = Document(
18 "\$search",
19 Document("index", "case-insensitive-sort")
20 .append(
21 "text",
22 Document("path", "title")
23 .append("query", "train")
24 )
25 .append(
26 "sort",
27 Document("title", 1)
28 )
29 )
30
31 // run query and print results
32 val resultsFlow = collection.aggregate<Document>(
33 listOf(
34 agg,
35 limit(5),
36 project(fields(
37 excludeId(),
38 include("title", "awards"),
39 computed("score", Document("\$meta", "searchScore"))
40 ))
41 )
42 )
43 resultsFlow.collect { println(it) }
44 }
45 mongoClient.close()
46}
4

接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

5

IDE でCaseInsensitiveQuery.ktプログラムを実行すると、次のドキュメントが出力されます。

Document{{title=atomic train, awards=Document{{wins=1, nominations=1}}, score=3.3326687812805176}}
Document{{title=Atomic Train, awards=Document{{wins=1, nominations=1, text=1 win & 1 nomination.}}, score=3.3326687812805176}}
Document{{title=how to train your dragon, awards=Document{{wins=32, nominations=51}}, score=2.2382168769836426}}
Document{{title=How to Train Your Dragon, awards=Document{{wins=32, nominations=51, text=Nominated for 2 Oscars. Another 30 wins & 51 nominations.}}, score=2.2382168769836426}}
Document{{title=How to Train Your Dragon 2, awards=Document{{wins=18, nominations=52, text=Nominated for 1 Oscar. Another 17 wins & 52 nominations.}}, score=2.0173802375793457}}

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

Document{{title=Atomic Train, awards=Document{{wins=1, nominations=1, text=1 win & 1 nomination.}}, score=3.3326687812805176}}
Document{{title=How to Train Your Dragon, awards=Document{{wins=32, nominations=51, text=Nominated for 2 Oscars. Another 30 wins & 51 nominations.}}, score=2.2382168769836426}}
Document{{title=How to Train Your Dragon 2, awards=Document{{wins=18, nominations=52, text=Nominated for 1 Oscar. Another 17 wins & 52 nominations.}}, score=2.0173802375793457}}
Document{{title=Howard Zinn: You Can't Be Neutral on a Moving Train, awards=Document{{wins=1, nominations=0, text=1 win.}}, score=1.446497917175293}}
Document{{title=Last Train Home, awards=Document{{wins=14, nominations=9, text=14 wins & 9 nominations.}}, score=2.8655927181243896}}

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

1
2

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

1const { MongoClient } = require("mongodb");
2
3// Replace the uri string with your MongoDB deployments connection string.
4const uri =
5 "<connection-string>";
6
7const client = new MongoClient(uri);
8
9async function run() {
10 try {
11 await client.connect();
12
13 // set namespace
14 const database = client.db("sample_mflix");
15 const coll = database.collection("movies");
16
17 // define pipeline
18 const agg = [
19 {
20 '$search': {
21 'index': 'case-insensitive-sort',
22 'text': { 'path': 'title', 'query': 'train' },
23 'sort': { 'title': 1 }
24 }
25 }, {
26 '$limit': 5
27 }, {
28 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' }}
29 }
30 ];
31
32 // run pipeline
33 const result = await coll.aggregate(agg);
34
35 // print results
36 await result.forEach((doc) => console.log(doc));
37
38 } finally {
39 await client.close();
40 }
41}
42run().catch(console.dir);
3

接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

4

次のコマンドを実行して、コレクションをクエリします。

node case-insensitive-query.js
{
_id: new ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.317898988723755
}
{
_id: new ObjectId("64de50ae2932de4dd3203061"),
title: 'atomic train',
awards: { wins: 1, nominations: 1 },
score: 3.317898988723755
}
{
_id: new ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.228306293487549
}
{
_id: new ObjectId("64de50da2932de4dd3204393"),
title: 'how to train your dragon',
awards: { wins: 32, nominations: 51 },
score: 2.228306293487549
}
{
_id: new ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.008449077606201
}

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

{
_id: new ObjectId("573a139cf29313caabcf662c"),
title: 'Atomic Train',
awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' },
score: 3.3326687812805176
}
{
_id: new ObjectId("573a13bbf29313caabd52ff4"),
title: 'How to Train Your Dragon',
awards: {
wins: 32,
nominations: 51,
text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'
},
score: 2.2382168769836426
}
{
_id: new ObjectId("573a13ccf29313caabd83281"),
title: 'How to Train Your Dragon 2',
awards: {
wins: 18,
nominations: 52,
text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'
},
score: 2.0173802375793457
}
{
_id: new ObjectId("573a13b1f29313caabd36490"),
title: "Howard Zinn: You Can't Be Neutral on a Moving Train",
awards: { wins: 1, nominations: 0, text: '1 win.' },
score: 1.446497917175293
}
{
_id: new ObjectId("573a13c8f29313caabd78a6b"),
title: 'Last Train Home',
awards: { wins: 14, nominations: 9, text: '14 wins & 9 nominations.' },
score: 2.8655927181243896
}

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

1
2

次のクエリは、大文字と小文字に関係なく結果をソートする方法を示しています。 テキスト演算子を使用して、 titleフィールドにtrainというタームが含まれる映画を検索し、その結果をtitleフィールド値で昇順にソートします。

クエリでは、結果内のドキュメントを5に制限するための$limitステージと、次の操作を行うための$projectステージを指定します。

  • 結果には_idtitleawardsフィールドのみが結果に含まれます。

  • 結果にスコアという名前のフィールドを追加する。

1import datetime
2import pymongo
3
4# connect to your Atlas cluster
5client = pymongo.MongoClient('<connection-string>')
6
7# define pipeline
8pipeline = [
9 {
10 '$search': {
11 'index': 'case-insensitive-sort',
12 'text': { 'path': 'title', 'query': 'train' },
13 'sort': { 'title': 1 }
14 }
15 }, {
16 '$limit': 5
17 }, {
18 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' } }
19 }
20]
21
22# run pipeline
23result = client['sample_mflix']['movies'].aggregate(pipeline)
24
25# print results
26for i in result:
27 print(i)
3

接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

4
python case-insensitive-query.py
{'_id': ObjectId('573a139cf29313caabcf662c'), 'title': 'Atomic Train', 'awards': {'wins': 1, 'nominations': 1, 'text': '1 win & 1 nomination.'}, 'score': 3.317898988723755}
{'_id': ObjectId('64de50ae2932de4dd3203061'), 'title': 'atomic train', 'awards': {'wins': 1, 'nominations': 1}, 'score': 3.317898988723755}
{'_id': ObjectId('573a13bbf29313caabd52ff4'), 'title': 'How to Train Your Dragon', 'awards': {'wins': 32, 'nominations': 51, 'text': 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'}, 'score': 2.228306293487549}
{'_id': ObjectId('64de50da2932de4dd3204393'), 'title': 'how to train your dragon', 'awards': {'wins': 32, 'nominations': 51}, 'score': 2.228306293487549}
{'_id': ObjectId('573a13ccf29313caabd83281'), 'title': 'How to Train Your Dragon 2', 'awards': {'wins': 18, 'nominations': 52, 'text': 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'}, 'score': 2.008449077606201}

結果には、大文字と小文字に関係なくソートされたドキュメントが含まれます。 ただし、 normalizernoneに設定すると、Atlas Search は次の結果を返します。

{'_id': ObjectId('573a139cf29313caabcf662c'), 'title': 'Atomic Train', 'awards': {'wins': 1, 'nominations': 1, 'text': '1 win & 1 nomination.'}, 'score': 3.3326687812805176}
{'_id': ObjectId('573a13bbf29313caabd52ff4'), 'title': 'How to Train Your Dragon', 'awards': {'wins': 32, 'nominations': 51, 'text': 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'}, 'score': 2.2382168769836426}
{'_id': ObjectId('573a13ccf29313caabd83281'), 'title': 'How to Train Your Dragon 2', 'awards': {'wins': 18, 'nominations': 52, 'text': 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'}, 'score': 2.0173802375793457}
{'_id': ObjectId('573a13b1f29313caabd36490'), 'title': "Howard Zinn: You Can't Be Neutral on a Moving Train", 'awards': {'wins': 1, 'nominations': 0, 'text': '1 win.'}, 'score': 1.446497917175293}
{'_id': ObjectId('573a13c8f29313caabd78a6b'), 'title': 'Last Train Home', 'awards': {'wins': 14, 'nominations': 9, 'text': '14 wins & 9 nominations.'}, 'score': 2.8655927181243896}

大文字と小文字を正規化せずに結果を並べ替えるには、 インデックス定義 でnormalizerオプションをnone ( 7行)に設定し、インデックス定義を保存して、クエリを再実行します。

戻る

日付型および数値型文字列クエリ