MongoDBのfind()で特定のフィールドだけを取得する方法(プロジェクションの使い方)
MongoDBでは、ドキュメント全体ではなく必要なフィールドだけを取得したい場面がよくあります。そんなときに役立つのが、find()メソッドの第2引数に指定できるプロジェクション(射影)です。ドット表記(dot notation)を組み合わせれば、ネストされたサブドキュメントの一部のフィールドだけを柔軟に取得することも可能です。
この記事では、実際にコレクションを作成しながら、フィールドのサブセットを取得する方法を具体的に解説します。
サンプルコレクションの作成
まず、クライアント情報を格納するコレクションを作成し、ドキュメントを挿入します。
> db.demo307.insertOne({
... "ClientId":101,
... "ClientDetails":{"ClientFirstName":"Chris","Age":34},
... "ClientCountryName":"US"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4eab88f8647eb59e56203c")
}
> db.demo307.insertOne({
... "ClientId":102,
... "ClientDetails":{"ClientFirstName":"David","Age":31},
... "ClientCountryName":"UK"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4eab97f8647eb59e56203d")
}insertOne()は1件のドキュメントを挿入するメソッドで、実行結果のacknowledged: trueは挿入が成功したことを示しています。
コレクション内の全ドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo307.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e4eab88f8647eb59e56203c"), "ClientId" : 101, "ClientDetails" : { "ClientFirstName" : "Chris", "Age" : 34 }, "ClientCountryName" : "US" }
{ "_id" : ObjectId("5e4eab97f8647eb59e56203d"), "ClientId" : 102, "ClientDetails" : { "ClientFirstName" : "David", "Age" : 31 }, "ClientCountryName" : "UK" }フィールドのサブセットを取得するクエリ
ここからが本題です。次のクエリでは、ClientFirstNameが「David」であるドキュメントを検索しつつ、プロジェクションを使って取得するフィールドを絞り込んでいます。
> db.demo307.find(
{"ClientDetails.ClientFirstName": 'David'},
{"ClientDetails.Age": 0, "ClientCountryName": 0, "ClientId": 0, "_id": 0}
);実行結果は次のとおりです。
{ "ClientDetails" : { "ClientFirstName" : "David" } }プロジェクションのポイント
このクエリの動作を整理すると、次のようになります。
第1引数(検索条件): ドット表記"ClientDetails.ClientFirstName": 'David'により、ネストされたフィールドを条件にドキュメントを絞り込みます。
第2引数(プロジェクション): 0を指定したフィールド(ClientDetails.Age、ClientCountryName、ClientId、_id)は結果から除外されます。その結果、ClientFirstNameだけが残り、必要な情報だけを効率的に取得できています。
なお、_idフィールドはデフォルトで常に返されるため、不要な場合は明示的に_id: 0と指定する必要がある点に注意してください。逆に、特定のフィールドだけを含めたい場合は、1を指定するインクルード方式(例:{"ClientDetails.ClientFirstName": 1})も利用できます。
-
MongoDBで2つの配列を$unwindで展開する方法
MongoDBで配列を展開(アンワインド)するには、集計パイプラインの $unwind 演算子を使用します。$unwind は入力ドキュメント内の配列フィールドを分解し、配列の各要素に対して1つのドキュメントを出力します。さらに includeArrayIndex オプションを組み合わせることで、2つの配列の要素をインデックス順にペアリングして取得することも可能です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo515.insertOne( ... { ... details1: [ ... 4700100004 ..
-
MongoDBで条件に一致する複数のサブドキュメントからフィールドを取得する方法
MongoDBで条件に一致する複数のサブドキュメントからフィールドを取得したい場合、aggregate()メソッドと$unwind演算子を組み合わせて使用するのが効果的です。この記事では、実際のコード例を通じてその手順を詳しく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo671.insertOne( ... { ... details : [ ... { ... id : 1 ... }, ... { ... CountryName:US, ...