プロジェクション ビルダ
項目一覧
Overview
このガイドでは、MongoDB Java ドライバーで ビルダ を使用して プロジェクション を指定する方法を学びます。
MongoDB はフィールドプロジェクションをサポートしており、クエリから結果を返すときに含めるフィールドと除外するフィールドを指定します。 MongoDB のプロジェクションは、いくつかの基本的なルールに従います。
_id
フィールドは明示的に除外されない限り、常に含まれます含めるフィールドを指定すると、
_id
フィールドを除く他のすべてのフィールドが暗黙的に除外されます除外するフィールドを指定すると、クエリ結果内のそのフィールドのみが削除されます
プロジェクションの仕組みの詳細については、こちらをご覧ください。
Projections
クラスは、すべての MongoDB プロジェクション演算子の静的ファクトリー メソッドを提供します。 各メソッドはBSON型のインスタンスを返します。このインスタンスは、プロジェクションを必要とする任意のメソッドに渡すことができます。
Tip
簡潔にするために、 プロジェクション のメソッドをインポートすることを選択できます。 クラスは静的に次のようになります。
import static com.mongodb.client.model.Projections.*;
次の例では、この静的インポートを前提としています。
サンプル ドキュメントと例
次のセクションでは、 projection_builders
というサンプル コレクションに対してクエリとプロジェクション操作を実行する例を紹介します。 各セクションでは、 collection
という名前の変数を使用して、 projection_builders
コレクションのMongoCollection
インスタンスを参照します。
コレクションには、2018 年と 2019 年の月間平均温度を摂氏単位で表す次のドキュメントが含まれています。
{ "year" : 2018, "type" : "even number but not a leap year", "temperatures" : [ { "month" : "January", "avg" : 9.765 }, { "month" : "February", "avg" : 9.675 }, { "month" : "March", "avg" : 10.004 }, { "month" : "April", "avg" : 9.983 }, { "month" : "May", "avg" : 9.747 }, { "month" : "June", "avg" : 9.65 }, { "month" : "July", "avg" : 9.786 }, { "month" : "August", "avg" : 9.617 }, { "month" : "September", "avg" : 9.51 }, { "month" : "October", "avg" : 10.042 }, { "month" : "November", "avg" : 9.452 }, { "month" : "December", "avg" : 9.86 } ] }, { "year" : 2019, "type" : "odd number, can't be a leap year", "temperatures" : [ { "month" : "January", "avg" : 10.023 }, { "month" : "February", "avg" : 9.808 }, { "month" : "March", "avg" : 10.43 }, { "month" : "April", "avg" : 10.175 }, { "month" : "May", "avg" : 9.648 }, { "month" : "June", "avg" : 9.686 }, { "month" : "July", "avg" : 9.794 }, { "month" : "August", "avg" : 9.741 }, { "month" : "September", "avg" : 9.84 }, { "month" : "October", "avg" : 10.15 }, { "month" : "November", "avg" : 9.84 }, { "month" : "December", "avg" : 10.366 } ] }
プロジェクション操作
次のセクションには、利用可能なプロジェクション操作と、 Projections
クラスを使用してそれらを構築する方法に関する情報が記載されています。
包含
1 つ以上のフィールドを含めるように指定するには、 include()
メソッドを使用します。
次の例には、 year
フィールドと(暗黙的に) _id
フィールドが含まれています。
Bson filter = Filters.empty(); Bson projection = include("year"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}
次の例には、 year
フィールドとtype
フィールド、および(暗黙的に) _id
フィールドが含まれています。
Bson filter = Filters.empty(); Bson projection = include("year", "type"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018, "type": "even number but not a leap year"} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "type": "odd number, can't be a leap year"}
Exclusion
1 つ以上のフィールドの除外を指定するには、 exclude()
メソッドを使用します。
次の例では、 temperatures
フィールドが除外されています。
Bson filter = Filters.empty(); Bson projection = exclude("temperatures"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018, "type": "even number but not a leap year"} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "type": "odd number, can't be a leap year"}
次の例では、type
フィールドとtemperatures
フィールドが除外されています。
Bson filter = Filters.empty(); Bson projection = exclude("temperatures", "type"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}
プロジェクションの組み合わせ
複数のプロジェクションを結合するには、 fields()
メソッドを使用します。
次の例には、 year
フィールドとtype
フィールドが含まれ、 _id
フィールドは除外されています。
Bson filter = Filters.empty(); Bson projection = fields(include("year", "type"), exclude("_id")); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"year": 2018, "type": "even number but not a leap year"} {"year": 2019, "type": "odd number, can't be a leap year"}
除外: _id
excludeId()
便利メソッドを使用して、 _id
フィールドの除外を指定します。
Bson filter = Filters.empty(); Bson projection = fields(include("year", "type"), excludeId()); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"year": 2018, "type": "even number but not a leap year"} {"year": 2019, "type": "odd number, can't be a leap year"}
配列要素一致のプロジェクション
elemMatch(String, Bson)
メソッド バリアントを使用して、指定されたクエリフィルターに一致する配列の最初の要素を含む配列プロジェクションを指定します。 このフィルタリングは、クエリフィルター(指定された場合)に一致するすべてのドキュメントが取得された後に発生します。
注意
一致の数に関係なく、指定されたクエリフィルターに一致する最初の要素のみが含まれます。
次の例えでは、 avg
フィールドが10.1
より大きいtemperatures
配列の最初の要素をプロジェクトします。
Bson filter = Filters.empty(); Bson projection = fields(include("year"), elemMatch("temperatures", Filters.gt("avg", 10.1))); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}
操作のクエリ部分で一致条件を指定した場合、 elemMatch(String)
メソッド バリアントを使用して、配列の最初の要素を含める位置プロジェクションを指定します。 クエリフィルターに一致するドキュメントのみが検索されます。
重要
MongoDB バージョン 4.4 未満では、指定された配列フィールドがクエリフィルターに表示される必要があります。 MongoDB 4.4 以降では、クエリフィルターに表示されない配列フィールドで位置プロジェクトを使用できます。
次の例えでは、 temperatures
配列の最初の要素をプロジェクションします。
Bson filter = Filters.gt("temperatures.avg", 10.1); Bson projection = fields(include("year"), elemMatch("temperatures")); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}
配列スライスのプロジェクション
配列のスライスをプロジェクションするには、 slice()
メソッドを使用します。
次の例では、 temperatures
配列の最初の6 つの要素をプロジェクションします。
Bson filter = Filters.empty(); // first half of the year Bson projection = slice("temperatures", 6); collection.find(filter).projection(projection) .forEach(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())));
次のコードは、このプロジェクションの 出力を示しています。
{ "_id": { "$oid": "6042f1bc8ee6fa2a84d2be69" }, "year": 2018, "type": "even number but not a leap year", "temperatures": [ ... <January-June temperature nested documents> ] } { "_id": { "$oid": "6042f1bc8ee6fa2a84d2be6a" }, "year": 2019, "type": "odd number, can't be a leap year", "temperatures": [ ... <January-June temperature nested documents> ] }
次の例では、 temperatures
配列の最初の6 つの要素をスキップし、次の6つのプロジェクションをプロジェクションします。
Bson filter = Filters.empty(); // second half of the year Bson projection = slice("temperatures", 6, 6); collection.find(filter).projection(projection) .forEach(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())));
次のコードは、このプロジェクションの 出力を示しています。
{ "_id": { "$oid": "6042f1bc8ee6fa2a84d2be69" }, "year": 2018, "type": "even number but not a leap year", "temperatures": [ ... <July-December temperature nested documents> ] } { "_id": { "$oid": "6042f1bc8ee6fa2a84d2be6a" }, "year": 2019, "type": "odd number, can't be a leap year", "temperatures": [ ... <July-December temperature nested documents> ] }
テキスト スコアのプロジェクション
テキスト クエリのスコアのプロジェクションを指定するには、 metaTextScore()
メソッドを使用します。
次の例では、テキスト スコアをscore
フィールドの値としてプロジェクションします。
Bson filter = Filters.text("even number"); Bson projection = fields(include("year"), metaTextScore("score")); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
次のコードは、このプロジェクションの 出力を示しています。
{"_id": {"$oid": "6042f1bc8ee6fa2a84d2be69"}, "year": 2018, "score": 1.25} {"_id": {"$oid": "6042f1bc8ee6fa2a84d2be6a"}, "year": 2019, "score": 0.625}