MongoDB Search では、インデックスでのソートを構成して、クエリ時でのソートではなく、インデックス時にドキュメントを昇順または降順で事前ソートできます。これは、結果セットが非常に大きく、クエリ時のソートが遅くなる場合に役立ちます。次の MongoDB Search フィールドタイプで sort インデックス オプションを使用できます。
booleandatenumber(整数、浮動小数、double 値)objectIdtokenuuid
noData オプションを使用して、null または不足値のソート方法を構成することもできます。
構文
sort オプションの構文は、次のとおりです。
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "boolean" | "date" | "number" | "objectId" | "token" | "uuid" 7 } 8 } 9 }, 10 "sort": { "<field-to-sort>": 1 | -1 } | { "<field-to-sort>": { "order": 1 | -1, "noData": "lowest" | "highest" } } 11 }
要件
ソートされたインデックスを使用するには、次の条件を満たす必要があります。
静的マッピングを使用して
sortに使用されるフィールドを構成します。booleandatenumber(整数、浮動小数、double 値)objectIdtoken(stringvalues)uuid
MongoDB Searchは、タイプの少なくとも 1 つが上記に示されているサポートされているタイプの 1 つである場合、
sortのために複数のタイプとしてインデックスされるフィールドをサポートします。ネストされたフィールドでソートするには、ルート フィールドまでのすべての中間フィールドを
documentタイプとして構成します。
注意
ダイナミックマッピングまたは typeSet を使用してインデックス化されているフィールドで sort オプションを指定すると、インデックス構築は失敗します。
動作
ソートされたインデックスは、クエリ時にソートするのではなく、インデックス構築中に構成されたトップレベルのソートを使用して MongoDB Search ドキュメントを物理的にソートします。これにより、$search.sort 仕様がインデックスのソートまたはその接頭辞と一致するクエリのパフォーマンスが向上します。特に、これはきわめて大規模な結果セット(結果に 100 万件以上のドキュメントが含まれる場合など)のソートに役立ちます。
explain 出力を使用して、クエリがインデックスのソートを使用しているかどうかを確認します。インデックスのソートの恩恵を受けるクエリには、フィールド usesIndexSort: true が含まれます。クエリのソート フィールドがインデックスのソートまたはインデックスのソートの接頭辞と一致すると、クエリは恩恵を受けます。
注意
スコアはクエリ時にのみ計算されるため、searchScore メタ式をソート済みインデックスの一部として使用することはできません。
配列サポート
配列フィールドでソートできます。MongoDB Search は配列をフラット化し、比較に 1 つの代表値を使用します。昇順ソートの場合は配列内の最低値を使用し、降順ソートの場合は配列内の最高値を使用します。
混合型配列のソート順序は、MongoDB BSON 比較順序に基づいています。昇順ソートの場合、 MongoDB Search はBSON型の最も低い要素を使用します。降順ソートの場合、 MongoDB Search は最も高いBSON type の要素を使用します。
埋め込みドキュメントのサポート
子フィールドでソートできるのは、すべての親ドキュメントが document タイプとして静的に定義されている場合のみです。
returnScope を使用したクエリは、ソートされたインデックスの定義がソート用のインデックス内のembeddedDocuments フィールドタイプをサポートしていないため、ソートされたインデックスの恩恵を受けられません。
Considerations
sort仕様のインデックスでは、インデックス構築とレプリケーションが遅くなる可能性があります。$search.sortをインデックスのソートの逆として指定したクエリは、ソートされていないインデックスを使用する場合と比較して低速になる可能性があります。他の$search.sort仕様を使用するクエリは影響を受けません。MongoDB Search は、インデックスごとに 1 つの
sort仕様のみをサポートします。異なるフィールドでソートする場合は、優先するソート順序をインデックスのソートとして選択します。
例
次の例では、sample_airbnb.listingsAndReviews コレクションのフィールドにソート済みインデックスを作成します。
次のインデックス定義は、number_of_reviews フィールドと last_reviewed フィールドを降順にソートします。
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": -1, "last_reviewed": -1 } }
次のインデックス定義は、number_of_reviews フィールドと last_reviewed フィールドを降順にソートします。結果の下部に、ヌル値または値がないドキュメントを配置します。
{ "mappings": { "dynamic": false, "fields": { "number_of_reviews": { "type": "number" }, "last_reviewed": { "type": "date" } } }, "sort": { "number_of_reviews": { "order": -1, "noData": "lowest" }, "last_reviewed": { "order": -1, "noData": "lowest" } } }
次のインデックス定義は、date フィールドを降順でソートします。date フィールドでソートするには、reviews フィールドを embeddedDocuments 型と document 型として定義します。
{ "mappings": { "dynamic": false, "fields": { "reviews": [ { "type": "embeddedDocuments", "dynamic": true }, { "type": "document", "dynamic": false, "fields": { "date": { "type": "date" } } } ] } }, "sort": { "reviews.date": -1 } }
次のインデックス定義は、結果の下部に null 値と不足値が表示されるように、property_type フィールドを昇順でソートします。property_type フィールドは、string、autocomplete、token タイプとして定義されます。インデックスは、ソートに token タイプのみを使用します。
{ "mappings": { "dynamic": false, "fields": { "property_type": [ { "type": "string" }, { "type": "autocomplete", "tokenization": "edgeGram", "minGrams": 2, "maxGrams": 15 }, { "type": "token" } ] } }, "sort": { "property_type": { "order": 1, "noData": "highest" } } }