HOWTO · MongoDB
MongoDB コレクション内のすべてのドキュメントに対して単一または複数のフィールドを選択する
この MongoDB チュートリアル記事では、返されるフィールドを指定または制限する射影を通じて基本的なクエリ操作を実行することにより、MongoDB コレクションで指定されたすべてのドキュメントに対して単一または複数のフィールドを選択する方法を学習します。
このページの内容
MongoDB のドキュメントからフィールドを選択するには、射影ドキュメントを find() の第2引数として渡します。含めるフィールドにはそれぞれ 1 を指定し、必要に応じて _id: 0 を指定すると、MongoDB が既定で含める識別子を除外できます。
射影を使って MongoDB コレクションのフィールドを選択する
射影は、一致した各ドキュメントについて MongoDB が返すフィールドを指定します。find() の第1引数はフィルター、第2引数は射影です。空のフィルター {} は、コレクション内のすべてのドキュメントに一致します。
実際に試すには、mongosh を MongoDB サーバーに接続し、teams コレクションに少数のドキュメントを挿入します。以下のコマンドでは、フィールド名として team、position、points をそのまま使っています。構文例であり、ここでは実行していません。
db.teams.insertMany([{ team: "Manchester City", position: "1st", points: 70 }, { team: "Liverpool", position: "2nd", points: 69 }, { team: "Chelsea", position: "3rd", points: 59 }]) この挿入を再度実行すると、同じドキュメント一式が追加されます。例を繰り返す場合は、新しいコレクションを使ってください。
挿入したドキュメントの全フィールドを確認するには、db.teams.find({}) を実行します。シェルには、一致したドキュメントと自動生成された _id の値が表示されます。結果の例(説明用。ObjectId の値は異なります):{ _id: ObjectId("<generated id>"), team: "Manchester City", position: "1st", points: 70 }、{ _id: ObjectId("<generated id>"), team: "Liverpool", position: "2nd", points: 69 }、{ _id: ObjectId("<generated id>"), team: "Chelsea", position: "3rd", points: 59 }。以下の例では同じコレクションを使い、これらのドキュメントからフィールドを返します。
特定のフィールドを含めて _id を除外する
射影でフィールドの値を 1 にすると、そのフィールドを含められます。たとえば、db.teams.find({}, { team: 1 }) は一致した各ドキュメントの team フィールドを返し、既定では _id も含めます。結果の例(説明用。ObjectId の値は異なります):{ _id: ObjectId("<generated id>"), team: "Manchester City" }、{ _id: ObjectId("<generated id>"), team: "Liverpool" }、{ _id: ObjectId("<generated id>"), team: "Chelsea" }。射影によってフィールド名が変更されることはありません。データベース上の識別子は team のままです。
識別子を除いて team を返すには、_id: 0 を追加します:db.teams.find({}, { team: 1, _id: 0 })。結果の例(説明用):{ team: "Manchester City" }、{ team: "Liverpool" }、{ team: "Chelsea" }。MongoDB では、ほかのフィールドを含めながら _id を除外できます。これは一般的な射影ルールの例外です。通常のフィールドについては、包含と除外を同じ射影で混在させることはできません。たとえば、team: 1 と points: 0 を組み合わせず、含めるフィールドを列挙してください。
複数のフィールドを含めて _id を除外するには、db.teams.find({}, { team: 1, points: 1, _id: 0 }) を使います。返される各ドキュメントには team と points が含まれます。結果の例(説明用):{ team: "Manchester City", points: 70 }、{ team: "Liverpool", points: 69 }、{ team: "Chelsea", points: 59 }。これらのフィールドとともに識別子も含めるには、射影から _id を省略するか、_id: 1 を指定します。
find() クエリは一致したドキュメントのカーソルを返し、mongosh はその内容を対話的に表示します。射影が変えるのは返される各ドキュメントのフィールドであり、一致するドキュメントの件数ではありません。返すドキュメントを絞り込みつつフィールドも選択する場合は、第1引数にフィルター条件を追加します。
まとめ
射影を find() の第2引数として渡し、含めるフィールドごとに 1 を指定します。MongoDB は既定で _id を含めるため、除外するには _id: 0 を追加します。包含射影では _id を除外できますが、それ以外は包含モードか除外モードのどちらかに統一してください。