Atlas Search 結果のカウント
Atlas Search count
オプションは、クエリの検索結果の数を表示するフィールドをメタデータの結果ドキュメントに追加します。 count
を使用して結果セットのサイズを決定できます。 $searchまたは$searchMeta
ステージで使用できます。 ドキュメントの合計数またはクエリに一致するドキュメント数の下限値を表示するには、演算子またはコレクターと組み合わせて使用する必要があります。
注意
シャーディングされたコレクションでcount
オプションを使用するには、クラスターで MongoDB v6.0 以降を実行する必要があります。MongoDB v7.2.0 を実行しているシャーディングされた Atlas クラスターでは、$searchMeta
でcount
に対するエラーが返される可能性があります。
MongoDB では、クエリのメタデータ結果のみを取得するために、$searchMeta
ステージで count
を使用することを推奨します。$search
ステージを使用してメタデータ結果とクエリ結果を取得するには、$$SEARCH_META
変数を使用する必要があります。詳細については、「SEARCH_META
集計変数」を参照してください。
注意
Atlas Search では、explain モードでcount
を使用して実行されたクエリの結果には count
結果は含まれません。
構文
count
の構文は次のとおりです。
{ "$searchMeta"|"$search": { "index": "<index name>", // optional, defaults to "default" "<operator>": { <operator-specifications> }, "count": { "type": "lowerBound"|"total", "threshold": <number-of-documents> //optional } } }
オプション
フィールド | タイプ | 説明 | 必須 |
---|---|---|---|
type | string | 結果セット内のドキュメントのカウントのタイプ。値は次のいずれかになります。
省略した場合、デフォルトは | no |
threshold | 整数 | type が lowerBound の場合に正確な数に含めるドキュメントの数。省略した場合、デフォルトは 1000 になります。これは、1000 までの任意の数値は正確な数であり、1000 を超える数値は結果のドキュメント数がおよその数であることを示します。 | no |
結果をカウントする
結果ドキュメントに含まれるカウント ドキュメントには、次の整数フィールドが含まれます。
SEARCH_META
集計変数
$search
ステージを使用してクエリを実行すると、Atlas Search はメタデータの結果を $$SEARCH_META
変数に保存し、検索結果のみを返します。サポートされているすべての集計パイプライン ステージで $$SEARCH_META
変数を使用して、$search
クエリのメタデータ結果を表示できます。
MongoDB では、検索結果とメタデータ結果の両方が必要な場合にのみ $$SEARCH_META
変数を使用することを推奨します。それ以外の場合は、次を使用します。
$search
ステージを使用して、検索結果のみを取得します。$searchMeta
ステージを使用して、メタデータ結果のみを取得します。
例
以下のように sample_mflix.movies
コレクションの released
フィールドにインデックスがあるとします。
{ "mappings": { "dynamic": false, "fields": { "released": { "type": "date" } } } }
次のクエリは、movies
コレクション内で 2011 年 9 月 1 日前後にリリースされた映画を検索します。このクエリは、結果の総数をリクエストします。このクエリには次のものが含まれます。
サンプルクエリでは、次のステージを使用します。
movies コレクション内で、 2011 年 9 月 01 日前後に公開された映画を検索します。このクエリは、genres フィールドの結果とメタデータの合計数をリクエストします。 | |
title と released 以外のすべてのフィールドをドキュメントから除外し、$$SEARCH_META 変数に保存されているメタデータの結果を meta という名前のフィールドの値として含めます。 | |
出力を 2 ドキュメントに制限します。 |
db.movies.aggregate([ { "$search": { "near": { "path": "released", "origin": ISODate("2011-09-01T00:00:00.000+00:00"), "pivot": 7776000000 }, "count": { "type": "total" } } }, { "$project": { "meta": "$$SEARCH_META", "title": 1, "released": 1 } }, { "$limit": 2 } ])
{ "_id" : ObjectId("573a13c3f29313caabd6b025"), "title" : "Submarino", "released" : ISODate("2011-09-01T00:00:00Z"), "meta" : { "count" : { "total" : NumberLong(23026) } } } { "_id" : ObjectId("573a13c7f29313caabd748f7"), "title" : "Devil's Playground", "released" : ISODate("2011-09-01T00:00:00Z"), "meta" : { "count" : { "total" : NumberLong(23026) } } }
sample_mflix.movies
コレクションの released
フィールドと genres
フィールドにインデックスがあるとします。
{ "mappings": { "dynamic": false, "fields": { "genres": { "type": "stringFacet" }, "released": { "type": "date" } } } }
サンプルクエリでは、次のステージを使用します。
movies コレクション内で、 2011 年 9 月 01 日前後に公開された映画を検索します。このクエリは、genres フィールドの結果とメタデータの合計数をリクエストします。 | |
出力を 2 ドキュメントに制限します。 | |
title 、released 、genres 以外のすべてのフィールドをドキュメントから除外し、ドキュメントの meta 配列内の $$SEARCH_META 変数に保存されているメタデータの結果を含めることで、$search の結果を処理します。 |
db.movies.aggregate([ { "$search": { "facet": { "operator": { "near": { "path": "released", "origin": ISODate("2011-09-01T00:00:00.000+00:00"), "pivot": 7776000000 } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } }, "count": { "type": "total" } } }, { "$limit": 2 }, { "$facet": { "results": [ { "$project": { "title": 1, "released": 1, "genres": 1 } } ], "meta": [ {"$replaceWith": "$$SEARCH_META"}, {"$limit": 1} ] } } ])
[ { results: [ { _id: ObjectId('573a13c3f29313caabd6b025'), genres: [ 'Drama' ], title: 'Submarino', released: ISODate('2011-09-01T00:00:00.000Z') }, { _id: ObjectId('573a13c7f29313caabd748f7'), genres: [ 'Action', 'Horror' ], title: "Devil's Playground", released: ISODate('2011-09-01T00:00:00.000Z') } ], meta: [ { count: { total: Long('20878') }, facet: { genresFacet: { buckets: [ { _id: 'Drama', count: Long('12149') }, { _id: 'Comedy', count: Long('6436') }, { _id: 'Romance', count: Long('3274') }, { _id: 'Crime', count: Long('2429') }, { _id: 'Thriller', count: Long('2400') }, { _id: 'Action', count: Long('2349') }, { _id: 'Adventure', count: Long('1876') }, { _id: 'Documentary', count: Long('1755') }, { _id: 'Horror', count: Long('1432') }, { _id: 'Biography', count: Long('1244') } ] } } } ] } ]
結果の詳細については、「結果のカウント」を参照してください。
例
次の例では、sample_mflix.movies
コレクションの year
フィールドのインデックスを使用します。
{ "mappings": { "dynamic": false, "fields": { "year": { "type": "number" } } } }
以下のクエリでは、movies
コレクション内の 2010
年から 2015
年までの映画を検索します。クエリは、結果の下限値を要求します。
db.movies.aggregate([ { "$searchMeta": { "range": { "path": "year", "gte": 2010, "lte": 2015 }, "count": { "type": "lowerBound" } } } ])
Atlas Search により次の結果が返されます。
{ "count" : { "lowerBound" : NumberLong(1001) } }
以下のクエリでは、movies
コレクション内の 2010
年から 2015
年までの映画を検索します。クエリは、結果の合計数をリクエストします。
db.movies.aggregate([ { "$searchMeta": { "range": { "path": "year", "gte": 2010, "lte": 2015 }, "count": { "type": "total" } } } ])
Atlas Search により次の結果が返されます。
{ "count" : { "total" : NumberLong(5971) } }
結果の詳細については、「結果のカウント」を参照してください。