MongoDB のフィールドを投影する

MongoDBMongoDBBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、ドキュメントを照会する際に MongoDB のプロジェクションを使用して特定のフィールドを選択および除外する方法を学びます。プロジェクションを使用することで、照会結果に返されるフィールドを制御でき、不要なデータ転送を削減して照会性能を向上させることができます。まずは、含めるフィールドを選択し、次に除外するフィールドを指定し、含めるフィールドと除外するフィールドを組み合わせ、ネストされたフィールドを投影し、出力フィールドをフォーマットする方法を学びます。この実験が終了するとき、MongoDB の照会でプロジェクションを効果的に活用する方法を十分に理解しているようになります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/start_mongodb_shell("Start MongoDB Shell") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/start_mongodb_shell -.-> lab-422089{{"MongoDB のフィールドを投影する"}} mongodb/find_documents -.-> lab-422089{{"MongoDB のフィールドを投影する"}} mongodb/project_fields -.-> lab-422089{{"MongoDB のフィールドを投影する"}} mongodb/work_with_array_data_types -.-> lab-422089{{"MongoDB のフィールドを投影する"}} mongodb/query_embedded_documents -.-> lab-422089{{"MongoDB のフィールドを投影する"}} mongodb/aggregate_group_totals -.-> lab-422089{{"MongoDB のフィールドを投影する"}} end

含めるフィールドを選択する

このステップでは、ドキュメントを照会する際に MongoDB のプロジェクションを使用して特定のフィールドを選択する方法を学びます。プロジェクションを使用することで、照会結果に返されるフィールドを正確に制御できます。

まず、MongoDB シェルを起動して、作業用のサンプル コレクションを作成しましょう。

mongosh

MongoDB シェルに入ったら、データベースを作成して、いくつかのサンプル ユーザー ドキュメントを追加します。

use projectlab_database

db.users.insertMany([
    {
        name: "John Doe",
        age: 30,
        email: "[email protected]",
        city: "New York",
        job: "Software Engineer"
    },
    {
        name: "Jane Smith",
        age: 28,
        email: "[email protected]",
        city: "San Francisco",
        job: "Data Scientist"
    },
    {
        name: "Mike Johnson",
        age: 35,
        email: "[email protected]",
        city: "Chicago",
        job: "Product Manager"
    }
])

次に、プロジェクションを使用して特定のフィールドのみを選択しましょう。フィールドを含めるには、プロジェクション ドキュメントで 1 を使用します。

db.users.find({}, { name: 1, age: 1, _id: 0 });

出力例:

[
  { name: 'John Doe', age: 30 },
  { name: 'Jane Smith', age: 28 },
  { name: 'Mike Johnson', age: 35 }
]

プロジェクションを解説しましょう。

  • { name: 1, age: 1, _id: 0 } は、次のような意味です。
    • name フィールドを含める
    • age フィールドを含める
    • _id フィールドを明示的に除外する (デフォルトでは、常に _id が返されます)

プロジェクションを使用することで、照会結果に返されるフィールドを正確に制御でき、不要なデータ転送を削減して照会性能を向上させることができます。

除外するフィールドを指定する

このステップでは、MongoDB の照会結果から特定のフィールドを除外する方法を学びます。この手法を使うと、ドキュメントの出力から不要なフィールドを削除できます。

前のステップで作成した users コレクションを引き続き使用します。フィールドを除外するには、プロジェクション ドキュメントで 0 を使用します。

db.users.find({}, { email: 0, city: 0 });

出力例:

[
  {
    _id: ObjectId("..."),
    name: 'John Doe',
    age: 30,
    job: 'Software Engineer'
  },
  {
    _id: ObjectId("..."),
    name: 'Jane Smith',
    age: 28,
    job: 'Data Scientist'
  },
  {
    _id: ObjectId("..."),
    name: 'Mike Johnson',
    age: 35,
    job: 'Product Manager'
  }
]

忘れないでください。重要なプロジェクションのルールは以下の通りです。

  • 同じプロジェクションで含めることと除外することを混ぜることはできません (_id を除く)
  • _id は、他のフィールドを含める場合に明示的に除外できる唯一のフィールドです
  • 0 を使用すると、照会結果から指定されたフィールドが削除されます

複数のフィールドを除外する別の例を試してみましょう。

db.users.find({}, { email: 0, city: 0, _id: 0 });

この照会は、メールアドレス、都市、および _id フィールドがないドキュメントを返し、名前、年齢、および職種のみを表示します。

含めると除外するを組み合わせる

このステップでは、MongoDB のプロジェクションにおいて含めると除外するを組み合わせる際の微妙なルールについて学びます。MongoDB は一般的に同じプロジェクションで含めると除外するを混ぜることを許さないのですが、_id フィールドには特別な例外があります。

既存の users コレクションを使ってこの概念を探ってみましょう。

まず、一般的なルールを示す例を試してみましょう。

// これはエラーを引き起こします
db.users.find({}, { name: 1, email: 0 });

含めると除外するプロジェクションを混ぜることはできないというエラー メッセージが表示されます。

しかし、_id は特別なケースです。他のフィールドを明示的に管理しながら _id フィールドを含めるか除外することができます。

db.users.find(
  {},
  {
    _id: 0, // _id を除外
    name: 1, // name を含める
    job: 1 // job を含める
  }
);

出力例:

[
  { name: 'John Doe', job: 'Software Engineer' },
  { name: 'Jane Smith', job: 'Data Scientist' },
  { name: 'Mike Johnson', job: 'Product Manager' }
]

別の組み合わせの例を試してみましょう。

db.users.find(
  {},
  {
    _id: 0, // _id を除外
    name: 1, // name を含める
    age: 1, // age を含める
    email: 0 // 通常はこれがエラーを引き起こすでしょうが、_id の例外により許されます
  }
);

要点:

  • 通常のフィールドについては、含めると除外するを混ぜることはできません
  • _id は、他のフィールドを投影する際に明示的に含めるか除外することができる唯一のフィールドです
  • 含めるか除外するフィールドを常に明示的に指定しましょう

ネストされたフィールドを投影する

このステップでは、MongoDB のドキュメント内のネストされたフィールドを投影する方法を学びます。ネストされたフィールドは、埋め込まれたドキュメントや配列内のフィールドであり、投影にはやや異なるアプローチが必要です。

まず、より複雑なネストされたドキュメントでユーザー コレクションを更新しましょう。

// 既存のドキュメントを削除
db.users.deleteMany({});

// ネスト構造を持つドキュメントを挿入
db.users.insertMany([
  {
    name: "John Doe",
    contact: {
      email: "[email protected]",
      phone: {
        mobile: "123-456-7890",
        work: "987-654-3210"
      }
    },
    skills: ["JavaScript", "MongoDB", "React"]
  },
  {
    name: "Jane Smith",
    contact: {
      email: "[email protected]",
      phone: {
        mobile: "234-567-8901",
        work: "876-543-2109"
      }
    },
    skills: ["Python", "Data Science", "Machine Learning"]
  }
]);

ネストされたフィールドを投影するには、ドット表記法を使用します。

// 特定のネストされたフィールドを投影
db.users.find(
  {},
  {
    name: 1,
    "contact.email": 1,
    "contact.phone.mobile": 1,
    _id: 0
  }
);

出力例:

[
  {
    name: 'John Doe',
    contact: {
      email: '[email protected]',
      phone: { mobile: '123-456-7890' }
    }
  },
  {
    name: 'Jane Smith',
    contact: {
      email: '[email protected]',
      phone: { mobile: '234-567-8901' }
    }
  }
]

配列フィールドも投影できます。

// 最初の 2 つのスキルを投影
db.users.find(
  {},
  {
    name: 1,
    skills: { $slice: 2 },
    _id: 0
  }
);

出力例:

[
  {
    name: 'John Doe',
    skills: ['JavaScript', 'MongoDB']
  },
  {
    name: 'Jane Smith',
    skills: ['Python', 'Data Science']
  }
]

ネストされたフィールドの投影に関する要点:

  • ネストされたフィールドにアクセスするにはドット表記法を使用します
  • 深くネストされたフィールドを投影できます
  • 配列の場合、返される要素の数を制限するには $slice を使用できます

出力フィールドをフォーマットする

このステップでは、MongoDB の投影と集約技術を使って出力フィールドをフォーマットして変換する方法を学びます。投影中にフィールドを改名、計算、変更する方法を探ります。

まず、より詳細な情報でユーザー コレクションを更新しましょう。

// 既存のドキュメントを削除
db.users.deleteMany({});

// より複雑なデータを持つドキュメントを挿入
db.users.insertMany([
  {
    name: "John Doe",
    age: 30,
    salary: 75000,
    department: "Engineering"
  },
  {
    name: "Jane Smith",
    age: 28,
    salary: 85000,
    department: "Data Science"
  },
  {
    name: "Mike Johnson",
    age: 35,
    salary: 95000,
    department: "Management"
  }
]);

投影中にフィールドを改名するには $ 演算子を使用します。

db.users.find(
  {},
  {
    fullName: "$name",
    yearsOld: "$age",
    annualSalary: "$salary",
    _id: 0
  }
);

出力例:

[
  { fullName: 'John Doe', yearsOld: 30, annualSalary: 75000 },
  { fullName: 'Jane Smith', yearsOld: 28, annualSalary: 85000 },
  { fullName: 'Mike Johnson', yearsOld: 35, annualSalary: 95000 }
]

また、$ 集約演算子を使って計算も行えます。

db.users.aggregate([
  {
    $project: {
      name: 1,
      monthlySalary: { $divide: ["$salary", 12] },
      salaryTier: {
        $switch: {
          branches: [
            { case: { $lt: ["$salary", 80000] }, then: "Junior" },
            { case: { $gte: ["$salary", 80000] }, then: "Senior" }
          ],
          default: "Unknown"
        }
      },
      _id: 0
    }
  }
]);

出力例:

[
  {
    name: 'John Doe',
    monthlySalary: 6250,
    salaryTier: 'Junior'
  },
  {
    name: 'Jane Smith',
    monthlySalary: 7083.333333333333,
    salaryTier: 'Senior'
  },
  {
    name: 'Mike Johnson',
    monthlySalary: 7916.666666666667,
    salaryTier: 'Senior'
  }
]

出力フィールドをフォーマットする際の要点:

  • 投影中にフィールドを改名するには $ を使用します
  • 集約パイプラインを使うと複雑なフィールド変換が可能です
  • 計算や条件付きフィールドを作成できます
  • $project ステージはフィールドのフォーマットに強力です

まとめ

この実験では、MongoDB の投影機能を使って、ドキュメントを照会する際に特定のフィールドを選択または除外する方法を学びます。まず必要なフィールドのみを含める方法から始め、不要なフィールドを除外する方法を探り、最後に含めると除外するを組み合わせて出力をカスタマイズします。また、ネストされたフィールドを投影する方法と出力をフォーマットする方法も学びます。これらの技術を使うことで、照会で返されるデータを制御し、パフォーマンスを向上させ、不要なデータ転送を削減できます。