Overview
このガイドでは、プロジェクションを使用して、読み取り操作から返されるフィールドを指定する方法を学習できます。 プロジェクションは、MongoDB がクエリから返すフィールドを指定するドキュメントです。
サンプル データ
このページの例では、sample_mflix.movies Atlasサンプルデータセット の コレクションを使用します。無料のMongoDB Atlasクラスターを作成し、サンプルデータセットをロードする方法については、.NET/C#ドライバーを使い始めるを参照してください。
次のクラスは、sample_mflix.moviesコレクション内のドキュメントを表します。
public class Movie { public ObjectId Id { get; set; } public string Title { get; set; } public List<string> Genres { get; set; } public string Type { get; set; } public string Plot { get; set; } public List<BsonDocument> Highlights { get; set; } public string Score { get; set; } [] public SearchScoreDetails ScoreDetails { get; set; } [] public SearchScoreDetails SearchScoreDetails { get; set; } [] public string PaginationToken { get; set; } public List<string> Cast { get; set; } [] public float[] PlotEmbedding { get; set; } }
注意
パスカルケースの ConventionPack
前のクラスのプロパティはパスカル ケースで名前付けされていますが、 MongoDBコレクション内のフィールド名はキャメル ケースを使用します。この違いを考慮するには、アプリケーションの起動時に次のコードを使用して ConventionPack を登録します。
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
プロジェクションを作成する
プロジェクションを作成するには、次の手順を実行します。
Builders<TDocument>.Projection静的プロパティを使用してProjectionDefinitionBuilder<TDocument>オブジェクトを作成します。TDocumentはコレクションのドキュメントがマップ先となるC#クラスを表します。ProjectionDefinitionBuilderクラスは、プロジェクションを定義するための型セーフなインターフェースを提供します。返されるドキュメントに含めるフィールドまたは除外するフィールドを指定するには、
ProjectionDefinitionBuilder<TDocument>オブジェクトからプロジェクションメソッドをチェーンします。結果の
ProjectionDefinition<TDocument>オブジェクトを 変数に保存します。検索または集計操作を実行した後、 変数を
Project()メソッドに渡します。
次のセクションでは、ProjectionDefinitionBuilder<TDocument>オブジェクトから連鎖できるメソッドについて説明します。
フィールドプロジェクション メソッド
次のメソッドを使用すると、返されるドキュメントに含めるフィールド、または除外するフィールドを指定できます。
ElmMatch
ElemMatch() メソッドは、クエリ結果の配列フィールドの内容を、指定された条件に一致する 最初の 要素のみを含めるように制限します。これは、 MongoDB Query APIで $elemMatch 演算子を使用して配列要素をプロジェクションするのと同じです。
ElemMatch() メソッドを使用するコード例については、 MongoDB Serverマニュアルの $elemMatch を参照してください。
式
Expression() メソッドでは、 Lambda式を使用して返されるドキュメントの構造を指定できます。 これは、 MongoDB Query APIの $project集計ステージで返されるドキュメントの構造を指定するのと同じです。
Expression() メソッドを使用するコード例については、 MongoDB Serverマニュアルの $プロジェクトを参照してください。
注意
ID フィールドの除外
Lambda式を使用してプロジェクションを作成すると、明示的に含めない限り、出力では Idフィールドが自動的に除外されます。
Exclude
Exclude() メソッドを使用すると、返されるドキュメントから除外するフィールドを指定できます。これは、 MongoDB Query APIの $project集計ステージでフィールドを除外することと同じです。_idフィールドを除外しない限り、1 つのプロジェクションに包含ステートメントと除外ステートメントを組み合わせることはできません。
Exclude() メソッドを使用するコード例については、 MongoDB Serverマニュアルの $プロジェクトを参照してください。
注意
_id フィールドの明示的除外
返されるドキュメントには、明示的に除外されない限り、_idフィールドが含まれます。ただし、Expression() メソッドを使用してプロジェクションを作成する場合は除きます。
次を含みます:
Include() メソッドを使用すると、返されるドキュメントに含めるフィールドを指定できます。これは、 MongoDB Query APIの $project集計ステージにフィールドを含めることと同じです。
Include() メソッドを使用するコード例については、 MongoDB Serverマニュアルの $プロジェクトを参照してください。
スライス
Slice() メソッドは、 クエリ結果フィールドで返されるリストまたは配列の要素の数を指定します。これはMongoDB Query APIで $slice 演算子を使用するのと同じです。
次のコード例では、Slice() メソッドを使用して、返されたドキュメントの cast 配列の Cast リストの最初の 3 つの要素を返します。
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie> .Projection .Slice(m => m.Cast, 3) .Include(m => m.Cast); var results = movieCollection.Find(filter) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "573a1398f29313caabceb500" }, "title": "Back to the Future Part II", "cast": [ "Michael J. Fox", "Christopher Lloyd", "Lea Thompson" ] }
コレクションの末尾 から要素を返すには、負の整数を Slice() メソッドに渡します。次のコード例では、返されたドキュメントの cast 配列にある Cast リストの最後の 3 つの要素を返します。
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie> .Projection .Slice(m => m.Cast, -3) .Include(m => m.Title); var results = movieCollection.Find(filter) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "573a1398f29313caabceb500" }, "title": "Back to the Future Part II", "cast": [ "Lea Thompson", "Thomas F. Wilson" ] }
コレクション内の指定された数の要素をスキップするには、最初のパラメーターとしてスキップする要素の数を渡し、2 番目のパラメーターとして返す要素の数を渡します。次のコード例では、Cast リストの最初の要素をスキップし、cast 配列の次の 3 つの要素を返します。
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie> .Projection .Slice(m => m.Cast, 1, 3) .Include(m => m.Title); var results = movieCollection.Find(filter) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "573a1398f29313caabceb500" }, "title": "Back to the Future Part II", "cast": [ "Christopher Lloyd", "Lea Thompson", "Thomas F. Wilson" ] }
$slice 演算子の詳細については、 MongoDB Serverマニュアルの $slice を参照してください。
メタデータ プロジェクション メソッド
次のメソッドを使用すると、返されるドキュメントに含めるメタデータフィールド、または除外するメタデータ フィールドを指定できます。メタデータ フィールドはデフォルトで 非表示 です。
Meta
Meta() メソッドを使用すると、返されるドキュメントに含めるメタデータフィールドを指定できます。これは、 MongoDB Query APIで $meta 演算子を使用してメタデータフィールドを含めることと同じです。
次のコード例では、返されたドキュメントに textScoreメタデータフィールドを score という名前のフィールドとして追加します。
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>.Projection .Include(m => m.Title) .Include(m => m.Plot) .Meta(field: "score", metaFieldName: "textScore"); var results = movieCollection.Find(filter) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "..." }, "plot": "...", "title": "...", "score": "..." }
MetaSearchHighlights
注意
MongoDB Search のみ
このメソッドは、MongoDB Search の結果をプロジェクションする場合にしか使用できません。
MetaSearchHighlights() では、返されたドキュメントに検索のハイライトが含まれます。これは、 MongoDB Query APIで { "$meta": "searchHighlights" }オブジェクトを使用して検索ハイライトを投影するのと同じです。検索のハイライトを取得するには、検索フィールドを指定する SearchHighlightOptionsオブジェクトを作成し、このオブジェクトをSearch() メソッドに渡す必要があります。
次のコード例では、plotフィールドの検索のハイライトを取得し、返されたドキュメントの Highlights という名前のプロパティにこれらのハイライトを含めます。
var filter = Builders<Movie>.Search.Text(path: m => m.Plot, query: "future"); var projection = Builders<Movie>.Projection .Include(m => m.Title) .Include(m => m.Plot) .MetaSearchHighlights(m => m.Highlights); var results = movieCollection .Aggregate() .Search(filter, new SearchHighlightOptions<Movie> (m => m.Plot)) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "573a13def29313caabdb5661" }, "plot": "She Can See Her Future, But Can't Escape Her Past.", "title": "West", "highlights": [ { "score": 1.286744475364685, "path": "plot", "texts": [ { "value": "She Can See Her ", "type": "text" }, { "value": "Future", "type": "hit" }, { "value": ", But Can't Escape Her Past.", "type": "text" } ] } ] }
検索のハイライトの詳細については、Atlas ドキュメントの「結果の検索タームのハイライト」を参照してください。
MetaSearchScore
注意
MongoDB Search のみ
このメソッドは、MongoDB Search の結果をプロジェクションする場合にしか使用できません。
MetaSearchScore() メソッドでは、返されたドキュメントに検索スコアが含まれます。これは、 MongoDB Query APIで { "$meta": "searchScore" }オブジェクトを使用して検索スコアを予測するのと同じです。
次のコード例では、score という名前のフィールドに各ドキュメントの検索スコアをプロジェクションします。
var filter = Builders<Movie>.Search.Text(m => m.Plot, "future"); var projection = Builders<Movie>.Projection .Include(m => m.Title) .Include(m => m.Plot) .MetaSearchScore(m => m.Score); var results = movieCollection .Aggregate() .Search(filter) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "573a13def29313caabdb5661" }, "plot": "She Can See Her Future, But Can't Escape Her Past.", "title": "West", "score": 2.8259084224700928 }
検索スコアの詳細については、結果内のドキュメントにスコアを付ける を参照してください。
MetaSearchScore Details
注意
MongoDB Search のみ
このメソッドは、MongoDB Search の結果をプロジェクションする場合にしか使用できません。
MetaSearchScoreDetails() には、返されたドキュメントの検索スコアに関する詳細が含まれます。これは、 MongoDB Query APIで { "$meta": "searchScoreDetails" }オブジェクトを使用して検索スコアの詳細をプロジェクションするのと同じです。
スコアの詳細を取得するには、ScoreDetailsプロパティが true に設定されている SearchOptionsオブジェクトを作成し、このオブジェクトをSearch() メソッドに渡します。次のコード例では、searchScoreDetailsという名前のフィールドに各ドキュメントの検索スコアの詳細をプロジェクションすることで、このプロセスを示しています。
var filter = Builders<Movie>.Search.Text(m => m.Plot, "future"); var projection = Builders<Movie>.Projection .Include(m => m.Title) .Include(m => m.Plot) .MetaSearchScore(m => m.Score) .MetaSearchScoreDetails(m => m.SearchScoreDetails); var results = movieCollection .Aggregate() .Search(filter, new SearchOptions<Movie>() { ScoreDetails = true}) .Project(projection) .Limit(1) .ToList();
{ "_id": { "$oid": "573a13def29313caabdb5661" }, ... "scoreDetails": { "value": 2.8259084224700928, "description": "$type:string/plot:future [BM25Similarity], result of:", "details": [ { "value": 2.8259084224700928, "description": "score(freq=1.0), computed as boost * idf * tf from:", "details": [ ... }
検索スコアの詳細の詳細については、Atlas ドキュメントのスコアの詳細の返却を参照してください。
MetaTextScore
MetaTextScore() メソッドでは、返されるドキュメントに $text 検索スコアが含まれます。これは、 MongoDB Query APIで { "$meta": "textScore" }オブジェクトを使用してテキスト検索スコアをプロジェクションするのと同じです。
MetaTextScore() メソッドを使用するコード例については、 MongoDB Serverマニュアルの $meta を参照してください。
MetaVectorSearchScore
注意
MongoDB ベクトル検索のみ
このメソッドは、 MongoDB ベクトル検索の結果をプロジェクションする場合にしか使用できません。
MetaVectorSearchScore() メソッドでは、返されるドキュメントにMongoDB ベクトル検索スコアが含まれます。これは、 MongoDB Query APIで { "$meta": "vectorSearchScore" }オブジェクトを使用してベクトル検索スコアをプロジェクションするのと同じです。
MongoDB ベクトル検索スコアの詳細については、Atlas ドキュメントの「 結果のドキュメントにスコアを付ける 」を参照してください。
searchMeta
注意
MongoDB Search のみ
このメソッドは、MongoDB Search の結果をプロジェクションする場合にしか使用できません。
SearchMeta() メソッドにはメタデータの 結果ドキュメントが含まれています。このドキュメントの構造は、結果のタイプによって異なります。これは、 MongoDB Query APIで $searchMeta集計ステージまたは $$SEARCH_META集計変数を使用してメタデータ結果ドキュメントをプロジェクションするのと同じです。
メソッドを使用するコード例については、Atlas ドキュメントの「 SearchMeta()MongoDB Search でファセットの使用方法 」を参照してください。
$searchMeta と $$SEARCH_META の詳細については、次の Atlas ドキュメントを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。