Atlas Search 結果のソート
項目一覧
Overview
Atlas Search を使用すると、Atlas Search インデックスで定義したフィールドの昇順または降順で結果を昇順または降順でソートできます。 sort
オプションを使用して、次のフィールドタイプで並べ替えることができます。
boolean
date
number
(整数、浮動小数、double 値)objectId
uuid
string
( トークンタイプとしてインデックス付け)
結果内のドキュメントのスコアでソートしたり、 null 値でソートしたりすることもできます。
使用法
Atlas Search の結果を並べ替えるには、次の操作を行う必要があります。
結果を並べ替えるには、 フィールドに Atlas Search インデックスを作成します。
boolean
、date
、number
、UUID
、objectId
フィールドで並べ替えるには、動的マッピングまたは静的マッピングを使用します。 string フィールドでソートするには、静的マッピングを使用してフィールドをtoken
タイプとしてインデックス付けする必要があります。並べ替え用インデックスで定義したフィールドに対して
sort
オプションを使用してクエリを作成し、実行します。 詳しくは、「構文 」を参照してください。
動作
ブール値、日付、数値、UUID、ObjectId、または string フィールドでソート
sort
オプションには、並べ替えるフィールドとそれぞれの並べ替え順序を指定するドキュメントが指定されます。 Atlas Search は、サポートされているデータ型のMongoDB 比較順序に従います。 UUID 値はBinData
のように扱われます。 詳細については、存在しないフィールドを参照してください。
次の並べ替え順序を指定して、結果を並べ替えることができます。
| 昇順でソートします。 昇順でソートすると、Atlas Search は、 値を持つドキュメントの前に欠損値を持つドキュメントを返します。 |
| 降順でソートします。 |
スコアと一意のフィールドで並べ替え
スコアの昇順または降順で並べ替えることもできます。 sort
オプションには$meta式を指定するドキュメントが指定されます。これにはsearchScore
値が必要です。
例
アプリケーションで、ユーザーが検索結果の最後のページにスキップできるとします。 次の例では、結果をスコアの昇順でソートし、スコアが最も低いドキュメントが結果の上部に表示されるようにします。
sort: {score: {$meta: "searchScore", order: 1}}
sort
を使用すると、結果内の複数のドキュメントのスコアが同じである場合に、結果の順序が特定の順序になるようにすることもできます。 たとえば、次の例に示すように、 lastUpdated
という名前の日付フィールドなど、一意のフィールドで結果をソートすると、Atlas Search は決定された順序で同じスコアを持つ結果を返します。
例
sort: {score: {$meta: "searchScore"}, lastUpdated: 1}
ただし、結果を並べ替えるための一意のフィールドを指定しない場合、Atlas Search はスコアの降順で並べ替えられた結果を返します。 Atlas Search では、スコアまたは値が同一の結果が任意の順序で返されます。 次の例では、結果を一意のフィールドでソートしません。
例
sort: {score: {$meta: "searchScore"}}
配列のソート
Atlas Search は、ソート用に配列をフラット化します。
例
次の配列について考えてみましょう。
[4, [1, [8,5], 9], 2]
Atlas Search は、次のように、前述の配列をフラット化します。
4, 1, 8, 5, 9, 2
昇順 並べ替えでは、Atlas Search は1
を使用して配列を他の値と比較します。 降順並べ替えでは、Atlas Search は9
を使用して配列を他の値と比較します。
配列内の要素と比較する場合:
昇順ソートでは、Atlas Search は配列の最小要素を比較するか、(
<
)未満の比較を実行します。例
Atlas Search では、数値で昇順にソートすると、次の順序で結果がソートされます。
-20 [-3, 12] // <- -3 comes before 5. 5 [6, 18] // <- 6 comes after 5. 13 14 降順ソートでは、Atlas Search は配列の最大要素を比較するか、 より大きい(
>
)比較を実行します。例
Atlas Search では、数値で降順にソートすると、次の順序で結果がソートされます。
[6, 18] // <- 18 comes before 14. 14 13 [-3, 12] // <- 12 comes after 13. 5 -20
複数のタイプで配列をソートする
複数の BSON型の値を含む配列フィールドをソートする場合、Atlas Search は配列から表される要素を選択し、 MongoDBの比較とデフォルトのソート順 に従って比較に使用します。
昇順 ソートの場合、Atlas Search はBSON型の最も低い要素を使用します。
降順ソートの場合、Atlas Search はBSON type の最も高い要素を使用します。
配列内に同じBSON type の値が複数ある場合、選択したタイプの標準ソート動作が適用されます。
例
次の配列について考えてみましょう。
[ 'foo', null, 15, true, false ]
昇順 並べ替え では、サポートされている最低のBSONタイプであるため、Atlas Search は
null
を使用します。降順並べ替えでは、Atlas Search は
true
を使用します。これは配列内で最も高いBSON型であり、Atlas Search はtrue
値を超えるfalse
値をランク付けします。
ただし、noData: highest
sort
構文で を設定すると、Atlas Search は null 値と欠損値を最上位のBSON型と見なします。例配列では、次の動作が適用されます。
昇順 ソートの場合、Atlas Search は
15
を使用します。これは配列の最低のBSONタイプになっているためです。降順ソートの場合、Atlas Search は
null
を使用します。これは配列の最上位のBSONタイプになっています。
詳細については、「 Null および欠損値によるソート 」を参照してください。
例については、「 マルチタイプの配列でのソート 」を参照してください。
Null および欠損値でソート
Atlas Search は、null 値を欠落値と空の値と等しいものとして扱い、これらの値を持つドキュメントの順序はソート時に非決定的です。
デフォルトでは 、Atlas Search はMongoDBの比較とソート順序に従い、null 値はサポートされている他のすべてのBSON型よりも低い値と見なします。そのため、昇順ソートでは null 値が結果の上部に表示され、降順ソートでは結果の最下位に表示されます。
結果に null 値が表示される場所を設定するには、noData
sort
構文で フィールドを指定します。noData
フィールドは次の値を取ります。
lowest
(デフォルト): ソート中に null 値を最小のBSONタイプとして設定します。昇順ソートでは null 値を結果の上部に、降順ソートでは最下位でソートします。highest
: ソート時に null 値を最上位のBSONタイプとして設定します。昇順ソートでは null 値を結果の下にソートし、降順ソートでは null 値を上部にソートします。
例については、「 null 値によるソート 」および「 マルチタイプ配列でのソート 」を参照してください。
埋め込みドキュメント配列フィールドでのソート
埋め込まれたドキュメント フィールドで親ドキュメントをソートするには、次の操作を行う必要があります。
埋め込まれたドキュメント子フィールドの親をドキュメントタイプとしてインデックス化します。
埋め込みドキュメント内のstring値を持つ子フィールドをトークンタイプとしてインデックスします。 数値値と日付値を持つ子フィールドの場合は、動的マッピングを有効にして、それらのフィールドを自動的にインデックス化します。
Atlas Search は親ドキュメントのみをソートします。 ドキュメントの配列内の子フィールドはソートされません。 例については、「ソートの例 」を参照してください。
Considerations
整合性
Atlas Search インデックスは 結果整合性があり、結果として返される値はソートで使用される値と異なる場合があります。
パフォーマンス
この機能により、後続の ステージとして$search
$limit
とともに使用するクエリが最適化されます。Atlas Search がコレクション内のすべてのドキュメントをソートする必要がある場合、応答が遅くなる可能性があります。
スコアリング
Atlas Search では、結果のすべてのドキュメントのスコアが返されます。 ただし、スコアで明示的に並べ替えない限り、結果内のドキュメントの順序が並べ替え条件に基づいているため、スコアの低いドキュメントの後にスコアの高いドキュメントが表示される可能性があります。
制限
embeddedDocuments型のフィールドではソートできません。
非推奨の knnBeta 演算子では
sort
オプションは使用できません。
互換性
Atlas は、メジャーおよびマイナーな MongoDB 5.0以降のすべてのバージョンで非シャーディングされたソート クエリをサポートしています。 シャーディングされたソート クエリは、 6.0のすべてのメジャー リリースと、 7.0以降のバージョンのすべてのメジャー リリースとマイナー リリースで利用できます。 MongoDB v 5.0以前を実行しているシャーディングされた Atlas クラスターでsort
を使用すると、Atlas Search はエラーを返します。
構文
sort
の構文は次のとおりです。
1 { 2 "$search": { 3 "index": "<index name>", // optional, defaults to "default" 4 "<operator>": { // such as "text", "compound", or "phrase" 5 <operator-specification> 6 }, 7 "sort": { 8 score: {$meta: "searchScore"}, // optional field 9 "<field-to-sort>": <sort-order>, // 1 or -1, or a document 10 ... 11 } 12 } 13 }
Parameter | 説明 | |||||
---|---|---|---|---|---|---|
| 任意。 検索スコアでソートするかどうかを決定します。 詳しくは、「 スコアと一意のフィールドで並べ替える 」を参照してください。 | |||||
| 必須。並べ替えるフィールドの名前。 | |||||
| 必須。 ソート順序を決定します。 昇順には noDataフィールドを指定する場合は、次の構文のドキュメントを使用します。
|
例
次の例では、 sample_mflix.movies
、 sample_airbnb.listingsAndReview
、またはusers
という名前のカスタム コレクションを使用します。
インデックスの定義
このページのサンプル クエリでは、 sample_mflix.movies
、 sample_airbnb.listingsAndReview
、またはカスタム コレクションのいずれかを使用します。 これらのコレクションに次のインデックスを作成すると、インデックス フィールドに対してサンプル クエリを実行できます。
movies
コレクションのインデックス定義では、次の内容を指定します。
インデックス
awards.wins
フィールドは次のようになります。number
ソートとクエリのタイプnumberFacet
ファセットクエリを実行するための型
インデックス
released
フィールドは次のようになります。date
ソートとクエリのタイプdateFacet
ファセットクエリを実行するための型
インデックス
title
フィールドは次のようになります。token
ソート用のタイプstring
クエリのタイプ
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "awards": { 6 "dynamic": false, 7 "fields": { 8 "wins": [ 9 { 10 "type": "number" 11 }, 12 { 13 "type": "numberFacet" 14 } 15 ] 16 }, 17 "type": "document" 18 }, 19 "released": [ 20 { 21 "type": "date" 22 }, 23 { 24 "type": "dateFacet" 25 } 26 ], 27 "title": [{ 28 "type": "token" 29 }, { 30 "type": "string" 31 }] 32 } 33 } 34 }
上記のインデックス定義では、Atlas Search は指定されたフィールドの静的マッピングを含むdefault
という名前のインデックスを作成します。
この例では、 sample_airbnb.listingsAndReviews
コレクションに対するクエリで次のインデックスを使用します。 インデックス定義は、コレクション内のフィールドの 動的マッピング を指定します。
{ "mappings": { "dynamic": true } }
users
コレクションには次のドキュメントが含まれます。
db.users.insertMany([ { "_id": 0, "a": UUID("1a324de2-e34b-c87e-f2a1-42ce37ad74ed"), "b": "hello", "c": ObjectId("507f1f77bcf86cd799439011") }, { "_id": 1, "a": UUID("3b241101-e2bb-4255-8caf-4136c566a962"), "b": "hello", "c": true }, { "_id": 2, "a": UUID("dee11d4e-63c6-4d90-983c-5c9f1e79e96c"), "b": "hello", "c": "foo" }, { "_id": 3, "b": "hello", "c": UUID("3be11d4e-62cb-4e95-9a3c-5c9f1e56c732") }, { "_id": 4, "a": UUID("d3c12e1c-c36e-25ed-7c3e-1e7f1e53c752"), "b": "hello", "c": null }, { "_id": 5, "a": UUID("d73f181e-cdda-42b4-b844-4d6e172e9bc8"), "b": "hello", "c": [] } { "_id": 6, "a": UUID("7eeddf21-b313-4a5c-81c2-c68915daa618"), "b": "hello", } ])
users
コレクションのインデックス定義では、次の内容を指定します。
c
という名前のフィールドを除くすべてのフィールドを動的にインデックス化します。c
という名前のフィールドを、並べ替え用の次のタイプとして静的にインデックス化します。token
uuid
objectId
boolean
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "c": [ 6 { "type": "token" }, 7 { "type": "uuid" }, 8 { "type": "objectId" }, 9 { "type": "boolean" }, 10 { "type": "number" } 11 ] 12 } 13 } 14 }
前述のコレクションでは、Atlas Search は、指定されたフィールドの指定されたマッピングで、 default
という名前のインデックスを作成します。
日付検索とソート
sample_mflix.movies
名前空間に対する次のクエリでは、 $search
ステージを使用して次の処理が行われます。
範囲演算子を使用して、2010 年 1 月 1 日から 2015 年 1 月 01 日の間に公開された映画を検索します。
sort
オプションを使用して、結果をリリース日の降順で並べ替えます。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して、結果のtitle
とreleased
を除くすべてのフィールドを省略します。
db.movies.aggregate([ { "$search": { "range": { "path": "released", "gt": ISODate("2010-01-01T00:00:00.000Z"), "lt": ISODate("2015-01-01T00:00:00.000Z") }, "sort": { "released": -1 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "released": 1 } } ])
[ { title: 'Cold in July', released: ISODate("2014-12-31T00:00:00.000Z") }, { title: 'The Gambler', released: ISODate("2014-12-31T00:00:00.000Z") }, { title: 'Force Majeure', released: ISODate("2014-12-30T00:00:00.000Z") }, { title: 'LFO', released: ISODate("2014-12-27T00:00:00.000Z") }, { title: 'Peace After Marriage', released: ISODate('2014-12-26T00:00:00.000Z') } ]
数値検索とソート
sample_mflix.movies
名前空間に対する次のクエリでは、 $search
ステージを使用して次の処理が行われます。
賞を受賞した映画を検索します。
sort
オプションを使用して、結果を降順で並べ替えます。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して、結果のtitle
とawards.wins
を除くすべてのフィールドを省略します。
db.movies.aggregate([ { "$search": { "range": { "path": "awards.wins", "gt": 3 }, "sort": { "awards.wins": -1 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "awards.wins": 1 } } ])
[ { 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 } }, ]
string 検索とソート
sample_mflix.movies
名前空間に対する次のクエリでは、 $search
ステージを使用して次の処理が行われます。
タイトルに
country
というタームが含まれる映画を検索します。sort
オプションを使用して、結果を昇順で並べ替えます。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して次の操作を実行します。
結果の
title
を除くすべてのフィールドを省略します。score
という名前のフィールドを追加します。
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "country" }, "sort": { "title": 1 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "score": { "$meta": "searchScore" } } } ])
[ { title: 'A Country Called Home', score: 2.536633253097534 }, { title: 'A Month in the Country', score: 2.258953094482422 }, { title: 'A Quiet Place in the Country', score: 2.0360684394836426 }, { title: 'A Sunday in the Country', score: 2.258953094482422 }, { title: 'Another Country', score: 3.3635599613189697 } ]
ObjectId でソート
次のクエリは、範囲演算子を使用して、 sample_mflix.movies
コレクションのreleased
フィールドで、 2015-01-01
と2015-12-31
の間に公開された映画を検索します。 結果は、タイプObjectId
の値を含む_id
フィールドで降順にソートされます。
db.movies.aggregate([ { "$search": { "range": { "path": "released", "gt": ISODate("2015-01-01T00:00:00.000Z"), "lt": ISODate("2015-12-31T00:00:00.000Z") }, "sort": { "_id": -1 } } }, { "$limit": 5 }, { "$project": { "_id": 1, "title": 1, "released": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: ObjectId('573a13fbf29313caabdedf31'), title: 'No Home Movie', released: ISODate('2015-08-10T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13fbf29313caabdedf30'), title: 'Our Loved Ones', released: ISODate('2015-08-12T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13faf29313caabded406'), title: 'The Red Spider', released: ISODate('2015-11-20T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13faf29313caabded1d6'), title: 'The Laundryman', released: ISODate('2015-07-11T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13faf29313caabdecaf3'), title: 'Right Now, Wrong Then', released: ISODate('2015-09-01T00:00:00.000Z'), score: 1 } ]
UUID でソート
次のクエリは、 users
コレクションのフィールドb
でhello
というタームを検索します。 クエリでは、多形データ(ソート順序を示すため)を含むフィールドa
で結果が昇順でソートされます。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "a": 1 } } }, { "$project": { "_id": 1, "a": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 3, score: 0.029335692524909973 }, { _id: 0, a: UUID('1a324de2-e34b-c87e-f2a1-42ce37ad74ed'), score: 0.029335692524909973 }, { _id: 1, a: UUID('3b241101-e2bb-4255-8caf-4136c566a962'), score: 0.029335692524909973 }, { _id: 6, a: UUID('7eeddf21-b313-4a5c-81c2-c68915daa618'), score: 0.029335692524909973 }, { _id: 4, a: UUID('d3c12e1c-c36e-25ed-7c3e-1e7f1e53c752'), score: 0.029335692524909973 }, { _id: 5, a: UUID('d73f181e-cdda-42b4-b844-4d6e172e9bc8'), score: 0.029335692524909973 }, { _id: 2, a: UUID('dee11d4e-63c6-4d90-983c-5c9f1e79e96c'), score: 0.029335692524909973 } ]
NULL 値でソート
テキスト b
hello
users
演算子を使用して、フィールド で コレクション内の文字列 を検索する次のクエリを検討してみましょう。次に、クエリは結果をフィールド でソートします。このフィールドにはコレクション内の一部のドキュメントにc
null または欠損値が含まれています。
詳細については、「 Null および欠損値によるソート 」を参照してください。
昇順ソート中に、Atlas Search は、次の例に示すように、デフォルトで 、null または欠落値が結果の上部に null または欠落値を持つドキュメントを返します。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": 1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.029335692524909973 }, { _id: 5, c: [], score: 0.029335692524909973 }, { _id: 6, score: 0.029335692524909973 }, { _id: 2, c: 'foo', score: 0.029335692524909973 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.029335692524909973 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.029335692524909973 }, { _id: 1, c: true, score: 0.029335692524909973 } ]
降順ソート中に、Atlas Search は、次の例に示すように、デフォルトで 、null または欠落値が結果の下部にあるドキュメントを返します。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": -1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
注意
noData: lowest
の設定はデフォルトの と同じです。
昇順ソート中に noData
フィールドを lowest
として指定すると、Atlas Search は、次の例に示すように、null または欠損値が結果の上部にあるドキュメントを返します。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": 1, "noData": "lowest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.029335692524909973 }, { _id: 5, c: [], score: 0.029335692524909973 }, { _id: 6, score: 0.029335692524909973 }, { _id: 2, c: 'foo', score: 0.029335692524909973 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.029335692524909973 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.029335692524909973 }, { _id: 1, c: true, score: 0.029335692524909973 } ]
降順ソート中に noData
フィールドを lowest
として指定すると、Atlas Search は、次の例に示すように、結果の下部に null または欠損値を含むドキュメントを返します。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": -1, "noData": "lowest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
昇順ソート中に noData
フィールドを highest
として指定すると、Atlas Search は、次の例に示すように、結果の下部に null または欠落値を含むドキュメントを返します。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": 1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
降順ソート中に noData
フィールドを highest
として指定すると、Atlas Search は、次の例に示すように、null または欠損値が結果の上部にあるドキュメントを返します。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": -1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 } ]
Atlas Search はソート時に null 値と欠損値を等しいものとして扱うため、"_id": 4
、"_id": 5
、"_id": 6
を含むドキュメントの順序はランダムです。
複数の型の配列でのソート
フィールドc
にマルチタイプの配列を持つ追加のドキュメントがある場合、ユーザーコレクションに対する次のクエリを検討します。
db.users.insertOne({ "_id": 7, "a": UUID("03e32aa9-1cbd-43b8-b9d6-18b171a03cc7"), "b": "hello", "c": [ false, null, 15 ] })
b
hello
次のクエリは、テキスト演算子を使用してフィールド で文字列 を検索し、その結果をフィールドc
でソートします。
注意
noData: lowest
並べ替え構文で を設定する方法は、デフォルトの と同じです。
昇順ソートの場合、Atlas Search は、複数型の配列を表すために、最も低いBSON型の要素を使用します。デフォルトでは 、Atlas Search は null または欠落値を最小のBSON値と見なします。したがって、Atlas Search はnull
_id: 7
を使用して を持つドキュメントのマルチタイプ配列を表し、このドキュメントを他の null および欠損値とともに返します。
詳細については、「 Null および欠損値によるソート 」および「 複数のタイプを使用した配列のソート 」を参照してください。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": 1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 } ]
Atlas Search はソート時に null 値と欠損値を等しいものとして扱うため、"_id": 4
、"_id": 5
、"_id": 6
、"_id": 7
を含むドキュメントの順序はランダムです。
降順ソートの場合、Atlas Search は、複数型の配列を表すために、最も高いBSON type の要素を使用します。 Atlas Searchfalse
_id: 7
では、配列内の最上位のBSON型であるため、 を使用して を含むドキュメントのマルチタイプ配列を表します。 Atlas Search はtrue
false
値も 値を超えてランク付けされているため、Atlas Search は_id: 1
を持つドキュメントの後にこのドキュメントを返します。
詳細については、「 Null および欠損値によるソート 」および「 複数のタイプを使用した配列のソート 」を参照してください。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": -1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 } { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 }, ]
Atlas Search はソート時に null 値と欠損値を等しいものとして扱うため、"_id": 4
、"_id": 5
、"_id": 6
を含むドキュメントの順序はランダムです。
次のクエリでは、並べ替え中にnoData: highest
null 値を最上位のBSON型として設定するには、 を指定します。
昇順ソートの場合、Atlas Search noData: highest
は、複数型の配列を表すために、最も低いBSON型の要素を使用します。クエリでは、null または欠損値を最高のBSON値と見なすために が指定されます。したがって、Atlas Search は を使用して を持つドキュメントの複数型配列を表します。これは、配列内で数値が次に低いBSON型であるためです。15
_id: 7
。
詳細については、「 Null および欠損値によるソート 」および「 複数のタイプを使用した配列のソート 」を参照してください。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": 1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
Atlas Search はソート時に null 値と欠損値を等しいものとして扱うため、"_id": 4
、"_id": 5
、"_id": 6
を含むドキュメントの順序はランダムです。
降順ソートの場合、Atlas Search は、複数型の配列を表すために、最も高いBSON type の要素を使用します。クエリではnoData
highest
null または欠落値を最高のBSON値として設定するために、 null
フィールドを として指定するため、Atlas Search は を使用して_id: 7
を持つドキュメントのマルチタイプ配列を表し、このドキュメントを で返します。は、他の null および欠落値とともに結果の先頭にあります。
詳細については、「 Null および欠損値によるソート 」および「 複数のタイプを使用した配列のソート 」を参照してください。
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": -1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 }, { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 } ]
Atlas Search はソート時に null 値と欠損値を等しいものとして扱うため、"_id": 4
、"_id": 5
、"_id": 6
、"_id": 7
を含むドキュメントの順序はランダムです。
ブール値でソート
次のクエリは、 sample_airbnb.listingsAndReviews
コレクションでPortugal
の プロパティを検索し、その結果をboolean
フィールドis_location_exact
の降順で並べ替えます。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して、結果のname
、 property_type
、 address.country
、 address.location.is_location_exact
以外のすべてのフィールドを省略します。
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "address.country", 6 "query": "Portugal" 7 }, 8 "sort": { 9 "address.location.is_location_exact": -1, 10 } 11 } 12 }, 13 { 14 "$limit": 5 15 }, 16 { 17 "$project": { 18 "_id": 0, 19 "name": 1, 20 "property_type": 1, 21 "address.country": 1, 22 "address.location.is_location_exact": 1 23 } 24 } 25 ])
1 [ 2 { 3 name: 'BBC OPORTO 4X2', 4 property_type: 'Apartment', 5 address: { country: 'Portugal', location: { is_location_exact: true } } 6 }, 7 { 8 name: 'Heroísmo IV', 9 property_type: 'Apartment', 10 address: { country: 'Portugal', location: { is_location_exact: true } } 11 }, 12 { 13 name: 'Spacious and well located apartment', 14 property_type: 'Apartment', 15 address: { country: 'Portugal', location: { is_location_exact: true } } 16 }, 17 { 18 name: 'Renovated Classic Design Studio with Sun Room', 19 property_type: 'Apartment', 20 address: { country: 'Portugal', location: { is_location_exact: true } } 21 }, 22 { 23 name: "O'Porto Studio | Historic Center", 24 property_type: 'Loft', 25 address: { country: 'Portugal', location: { is_location_exact: true } } 26 } 27 ]
前述の結果では、ドキュメントのis_location_exact
の値はtrue
です。降順ソートでは、Atlas Search はtrue
の値をfalse
の値より超えてランク付けするためです。 前のクエリの9行の値を1
に変更して昇順並べ替えを行うと、Atlas Search はfalse
の値がtrue
値よりも高いドキュメントをランク付けし、次のドキュメントを返します。
[ { name: 'Ribeira Charming Duplex', property_type: 'House', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'Be Happy in Porto', property_type: 'Loft', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'Downtown Oporto Inn (room cleaning)', property_type: 'Hostel', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'A Casa Alegre é um apartamento T1.', property_type: 'Apartment', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'FloresRooms 3T', property_type: 'Apartment', address: { country: 'Portugal', location: { is_location_exact: false } } } ]
複合検索とソート
次のクエリでは、 $search
ステージを使用して次の操作を実行します。
タイトルに
dance
というタームが含まれる映画を検索します。2 つ以上の賞を受賞し、1990 年 1 月 1 日以降にリリースされた映画が優先されます。結果を賞の数で降順に並べ替え、次に映画タイトルの昇順で並べ替え、次に公開日の降順で並べ替えます。
クエリは$limit
ステージを使用して出力を10
ドキュメントに制限します。 また、 $project
ステージを使用して次の操作を実行します。
結果の
title
、released
、awards.wins
以外のすべてのフィールドを省略します。score
という名前のフィールドを追加します。
db.movies.aggregate([ { "$search": { "compound": { "must": [{ "text": { "path": "title", "query": "dance" } }], "should": [{ "range": { "path": "awards.wins", "gte": 2 } }, { "range": { "path": "released", "gte": ISODate("1990-01-01T00:00:00.000Z") } }] }, "sort": { "awards.wins": -1, "title": 1, "released": -1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "awards.wins": 1, "score": { "$meta": "searchScore" } } } ])
[ { title: 'Shall We Dance?', released: ISODate("1997-07-11T00:00:00.000Z"), awards: { wins: 57 }, score: 4.9811458587646484 }, { title: 'Shall We Dance?', released: ISODate("1997-07-11T00:00:00.000Z"), awards: { wins: 57 }, score: 4.9811458587646484 }, { title: 'War Dance', released: ISODate("2008-11-01T00:00:00.000Z"), awards: { wins: 11 }, score: 5.466421127319336 }, { title: 'Dance with the Devil', released: ISODate("1997-10-31T00:00:00.000Z"), awards: { wins: 6 }, score: 4.615056037902832 }, { title: 'Save the Last Dance', released: ISODate("2001-01-12T00:00:00.000Z"), awards: { wins: 6 }, score: 4.615056037902832 }, { title: 'Dance with a Stranger', released: ISODate("1985-08-09T00:00:00.000Z"), awards: { wins: 4 }, score: 3.615056037902832 }, { title: 'The Baby Dance', released: ISODate("1998-08-23T00:00:00.000Z"), awards: { wins: 4 }, score: 4.981145858764648 }, { title: 'Three-Step Dance', released: ISODate("2004-02-19T00:00:00.000Z"), awards: { wins: 4 }, score: 4.981145858764648 }, { title: "Cats Don't Dance", released: ISODate("1997-03-26T00:00:00.000Z"), awards: { wins: 3 }, score: 4.981145858764648 }, { title: 'Dance Me Outside', released: ISODate("1995-03-10T00:00:00.000Z"), awards: { wins: 3 }, score: 4.981145858764648 } ]
ファセット検索とソート
次のクエリでは、 $search
ステージを使用して次の操作を実行します。
範囲演算子を使用して、2010 年 1 月 1 日から 2015 年 1 月 01 日の間に公開された映画を検索します。
1
、5
、10
、15
の各賞を受賞した映画の数を取得します。2010-01-01
、2011-01-01
、2012-01-01
、2013-01-01
、2014-01-01
、2015-01-01
でリリースされた映画の数を取得します。sort
オプションを使用して、結果をリリース日の降順で並べ替えます。
クエリは、 $limit
ステージを使用して次の処理を実行します。
docs
出力フィールドの5
ドキュメントに出力を制限します。meta
出力フィールドの1
ドキュメントへの出力を制限します。
$project
ステージを使用して、 awards.wins
、 released
、 title
フィールドを除くすべてのフィールドを省略します。
また、 $replaceWith
ステージを使用して$$SEARCH_META
変数に保存されているメタデータの結果をmeta
出力フィールドに含め、 $set
ステージを使用してmeta
フィールドを結果に追加します。
db.movies.aggregate([ { "$search": { "facet": { "operator": { "range": { "path": "released", "gt": ISODate("2010-01-01T00:00:00.000Z"), "lt": ISODate("2015-01-01T00:00:00.000Z") } }, "facets": { "awardsFacet": { "type": "number", "path": "awards.wins", "boundaries" : [1,5,10,15] }, "releasedFacet" : { "type" : "date", "path" : "released", "boundaries" : [ISODate("2010-01-01T00:00:00.000Z"), ISODate("2011-01-01T00:00:00.000Z"), ISODate("2012-01-01T00:00:00.000Z"), ISODate("2013-01-01T00:00:00.000Z"), ISODate("2014-01-01T00:00:00.000Z"), ISODate("2015-01-01T00:00:00.000Z")] } } }, "sort": { "released": -1 } } }, { "$facet": { "docs": [ { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "released": 1, "awards.wins": 1 } } ], "meta": [ {"$replaceWith": "$$SEARCH_META"}, {"$limit": 1} ] } }, { "$set": { "meta": { "$arrayElemAt": ["$meta", 0] } } } ])
[ { docs: [ { title: 'Cold in July', released: ISODate("2014-12-31T00:00:00.000Z"), awards: { wins: 1 } }, { title: 'The Gambler', released: ISODate("2014-12-31T00:00:00.000Z"), awards: { wins: 7 } }, { title: 'Force Majeure', released: ISODate("2014-12-30T00:00:00.000Z"), awards: { wins: 31 } }, { title: 'LFO', released: ISODate("2014-12-27T00:00:00.000Z"), awards: { wins: 3 } }, { title: 'Peace After Marriage', released: ISODate('2014-12-26T00:00:00.000Z'), awards: { wins: 5 } } ], meta: { count: { lowerBound: Long("4821") }, facet: { releasedFacet: { buckets: [ { _id: ISODate("2010-01-01T00:00:00.000Z"), count: Long("857") }, { _id: ISODate("2011-01-01T00:00:00.000Z"), count: Long("909") }, { _id: ISODate("2012-01-01T00:00:00.000Z"), count: Long("903") }, { _id: ISODate("2013-01-01T00:00:00.000Z"), count: Long("1063") }, { _id: ISODate("2014-01-01T00:00:00.000Z"), count: Long("1089") } ] }, awardsFacet: { buckets: [ { _id: 1, count: Long("2330") }, { _id: 5, count: Long("604") }, { _id: 10, count: Long("233") } ] } } } } } ]
スコアで並べ替え
次の例は、結果内のドキュメントのスコアで結果を並べ替える方法を示しています。 例では、次のアクションを実行する方法が示されています。
最初に、結果を昇順でソートして、スコアが最も低いドキュメントを取得します。
結果をスコアの降順で並べ替え、スコアが同じ結果の場合は任意に並べ替えます。
結果をスコアで並べ替え、スコアが同一の結果については、 一意の フィールドを使用して並べ替えます。
次のクエリは、 $search
ステージを使用して次のアクションを実行します。
タイトルに
story
というタームが含まれる映画を検索します。結果をスコアの昇順で並べ替えます。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して次のアクションを実行します。
結果の
title
を除くすべてのフィールドを省略します。score
という名前のフィールドを追加します。
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "story" }, "sort": {score: {$meta: "searchScore", order: 1}} } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "score": {$meta: "searchScore"} } } ])
[ { title: 'Do You Believe in Miracles? The Story of the 1980 U.S. Hockey Team', score: 0.8674521446228027 }, { title: 'Once in a Lifetime: The Extraordinary Story of the New York Cosmos', score: 0.9212141036987305 }, { title: 'The Source: The Story of the Beats and the Beat Generation', score: 0.9820802211761475 }, { title: 'If These Knishes Could Talk: The Story of the NY Accent', score: 0.9820802211761475 }, { title: 'Dream Deceivers: The Story Behind James Vance vs. Judas Priest', score: 1.051558256149292 } ]
次のクエリは、 $search
ステージを使用して次のアクションを実行します。
タイトルに
summer
というタームが含まれる映画を検索します。結果をスコアの降順で並べ替え、スコアが同じ結果の場合は任意に並べ替えます。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して次のアクションを実行します。
結果の
_id
とtitle
を除くすべてのフィールドを省略します。score
という名前のフィールドを追加します。
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "summer" }, "sort": {score: {$meta: "searchScore"}} } }, { "$limit": 5 }, { "$project": { "_id": 1, "title": 1, "score": {$meta: "searchScore"} } } ])
[ { _id: ObjectId("573a1398f29313caabcea21e"), title: 'Summer', score: 3.5844719409942627 }, { _id: ObjectId("573a13a6f29313caabd18eca"), title: 'Summer Things', score: 3.000213623046875 }, { _id: ObjectId("573a13b8f29313caabd4c1d0"), title: 'Summer Palace', score: 3.000213623046875 }, { _id: ObjectId("573a1394f29313caabcde8e8"), title: 'Summer Stock', score: 3.000213623046875 }, { _id: ObjectId("573a13acf29313caabd284fa"), title: 'Wolf Summer', score: 3.000213623046875 } ]
次のクエリは、 $search
ステージを使用して次のアクションを実行します。
タイトルに
prince
というタームが含まれる映画を検索します。最初にスコアで結果を並べ替え、次に
released
フィールドの値で昇順に並べ替え、同一のスコアを持つ結果を作成します。
クエリは$limit
ステージを使用して出力を5
ドキュメントに制限します。 また、 $project
ステージを使用して次のアクションを実行します。
結果の
title
とreleased
を除くすべてのフィールドを省略します。score
という名前のフィールドを追加します。
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "prince" }, "sort": {score: {$meta: "searchScore"}, "released": 1} } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "released": 1, "score": {$meta: "searchScore"} } } ])
[ { title: 'Prince', released: ISODate("2015-08-14T00:00:00.000Z"), score: 4.168826103210449 }, { title: 'Prince Avalanche', released: ISODate("2013-09-19T00:00:00.000Z"), score: 3.4893198013305664 }, { title: 'The Prince', released: ISODate("2014-08-22T00:00:00.000Z"), score: 3.4893198013305664 }, { title: 'Prince of Foxes', released: ISODate("1949-12-23T00:00:00.000Z"), score: 3.0002830028533936 }, { title: 'The Oil Prince', released: ISODate("1966-01-01T00:00:00.000Z"), score: 3.0002830028533936 } ]