MongoDB コレクションをフィルタリングする

MongoDBMongoDBBeginner
今すぐ練習

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

はじめに

この実験では、さまざまなクエリ手法を使って MongoDB コレクションを効果的にフィルタリングする方法を学びます。この実験では、複数の条件を適用すること、比較演算子を使うこと、正規表現を一致させること、フィールドの存在を確認すること、および null 値を見つけることが扱われます。これらのスキルは、MongoDB でデータを照会して操作する際に不可欠であり、データベースから正確かつ関連性のある情報を抽出することができます。手順に沿った説明は、実際の例と解説を提供しており、MongoDB の照会の基本を身につけるのに役立ちます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/DataTypesGroup -.-> mongodb/use_numeric_data_types("Use Numeric Data Types") mongodb/DataTypesGroup -.-> mongodb/use_string_data_types("Use String Data Types") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") subgraph Lab Skills mongodb/find_documents -.-> lab-421806{{"MongoDB コレクションをフィルタリングする"}} mongodb/query_with_conditions -.-> lab-421806{{"MongoDB コレクションをフィルタリングする"}} mongodb/use_numeric_data_types -.-> lab-421806{{"MongoDB コレクションをフィルタリングする"}} mongodb/use_string_data_types -.-> lab-421806{{"MongoDB コレクションをフィルタリングする"}} mongodb/query_embedded_documents -.-> lab-421806{{"MongoDB コレクションをフィルタリングする"}} end

複数の条件を適用する

このステップでは、MongoDB コレクションを照会する際に複数の条件を適用する方法を学びます。複数の条件を使うことで、データを効果的にフィルタリングするための、より正確で複雑なクエリを作成できます。

まず、ターミナルを開き、MongoDB シェルを起動します。

mongosh

次に、複数の条件クエリを示すためのサンプルの学生コレクションを作成しましょう。

use school_database

db.students.insertMany([
    { name: "Alice", age: 22, grade: "A", major: "Computer Science" },
    { name: "Bob", age: 20, grade: "B", major: "Mathematics" },
    { name: "Charlie", age: 25, grade: "A", major: "Physics" },
    { name: "David", age: 19, grade: "C", major: "Computer Science" }
])

$and 演算子を使って複数の条件を適用する方法を見てみましょう。これにより、すべてが真でなければならない複数の条件を指定できます。

db.students.find({
  $and: [{ age: { $gte: 20 } }, { grade: "A" }]
});

このクエリは、20歳以上で、かつ「A」の成績を持つ学生を返します。条件を分解してみましょう。

  • $gte は「以上」を意味します
  • $and は両方の条件が満たされなければならないことを保証します

以下のような出力が表示されるはずです。

[
  {
    _id: ObjectId("..."),
    name: 'Alice',
    age: 22,
    grade: 'A',
    major: 'Computer Science'
  },
  {
    _id: ObjectId("..."),
    name: 'Charlie',
    age: 25,
    grade: 'A',
    major: 'Physics'
  }
]

また、$or 演算子を使って、少なくとも 1 つの条件に一致するドキュメントを見つけることもできます。

db.students.find({
  $or: [{ major: "Computer Science" }, { age: { $lt: 21 } }]
});

このクエリは、コンピュータサイエンスの学科に所属している、または 21 歳未満の学生を返します。

  • $lt は「未満」を意味します

結果には、デビッド(21歳未満)や、アリスとデビッド(コンピュータサイエンスの学科に所属)のような学生が含まれます。

比較演算子を使用する

このステップでは、MongoDB の比較演算子について学びます。これらの演算子を使うことで、さまざまな条件に基づいてデータをフィルタリングするための、より洗練されたクエリを作成できます。

まず、MongoDB シェルに入っていることを確認します。

mongosh

前のステップで使用した school_database を引き続き使用しましょう。シェルを閉じてしまった場合は、学生コレクションを再作成します。

use school_database

db.students.insertMany([
    { name: "Alice", age: 22, grade: "A", major: "Computer Science", credits: 45 },
    { name: "Bob", age: 20, grade: "B", major: "Mathematics", credits: 35 },
    { name: "Charlie", age: 25, grade: "A", major: "Physics", credits: 50 },
    { name: "David", age: 19, grade: "C", major: "Computer Science", credits: 25 }
])

MongoDB は、データを正確にフィルタリングするための強力な比較演算子を提供しています。いくつかの重要な演算子を見てみましょう。

  1. より大きい ($gt) とより小さい ($lt):
db.students.find({ age: { $gt: 20, $lt: 25 } });

このクエリは、20歳より大きく、25歳未満の学生を見つけます。この例では、アリスが返されます。

  1. 以上 ($gte) と以下 ($lte):
db.students.find({ credits: { $gte: 40, $lte: 50 } });

これは、40 から 50 単位(含む)の単位数を持つ学生を見つけます。これにより、アリスとチャーリーが返されます。

  1. 等しくない ($ne):
db.students.find({ grade: { $ne: "C" } });

これは、成績が「C」でない学生を返します。これは、アリス、ボブ、チャーリーになります。

これらの演算子を分解してみましょう。

  • $gt:より大きい
  • $lt:より小さい
  • $gte:以上
  • $lte:以下
  • $ne:等しくない

各クエリは、比較演算子を使ってデータを正確にフィルタリングするさまざまな方法を示しています。

正規表現を一致させる

このステップでは、MongoDB で正規表現 (regex) を使ってコレクション内で柔軟で強力なテキスト検索を行う方法を学びます。

まず、MongoDB シェルに入っていることを確認します。

mongosh

school_database を引き続き使用し、もう少し多様なデータを追加しましょう。

use school_database

db.students.insertMany([
    { name: "Alice Johnson", age: 22, major: "Computer Science", email: "[email protected]" },
    { name: "Bob Smith", age: 20, major: "Mathematics", email: "[email protected]" },
    { name: "Charlie Brown", age: 25, major: "Physics", email: "[email protected]" },
    { name: "David Lee", age: 19, major: "Computer Engineering", email: "[email protected]" }
])

MongoDB の正規表現を使うと、複雑なテキスト検索ができます。さまざまな正規表現パターンを見てみましょう。

  1. 特定の文字で始まる名前を見つける:
db.students.find({ name: { $regex: "^A" } });

このクエリは、名前が "A" で始まる学生を見つけます。^ 記号は「~で始まる」を意味します。

  1. 特定のドメインのメールアドレスを見つける:
db.students.find({ email: { $regex: "@example.com$" } });

このクエリは、メールアドレスが "@example.com" で終わる学生を見つけます。$ 記号は「~で終わる」を意味します。

  1. 大文字小文字を区別しない正規表現検索:
db.students.find({ name: { $regex: "johnson", $options: "i" } });

これは、大文字小文字を区別せずに "johnson" を含む名前を見つけます。$options: "i" は検索を大文字小文字を区別しなくするものです。

  1. 部分一致:
db.students.find({ major: { $regex: "Computer" } });

これは、専攻分野に "Computer" が含まれている学生を見つけます。

正規表現パターンは、データを検索してフィルタリングする強力な方法を提供します。

  • ^:~で始まる
  • $:~で終わる
  • $options: "i":大文字小文字を区別しない一致
  • 部分一致には特別な記号は必要ありません

フィールドの存在を確認する

このステップでは、MongoDB ドキュメント内のフィールドの存在を確認する方法を学びます。フィールドの存在に基づいてコレクションをフィルタリングするための強力な演算子を使用します。

まず、MongoDB シェルに入っていることを確認します。

mongosh

フィールドの存在確認を示すために、異なる構造のドキュメントを持つコレクションを作成しましょう。

use school_database

db.students.insertMany([
    { name: "Alice Johnson", age: 22, major: "Computer Science", scholarship: 1000 },
    { name: "Bob Smith", age: 20, major: "Mathematics" },
    { name: "Charlie Brown", age: 25, major: "Physics", internship: "Research Lab" },
    { name: "David Lee", age: 19, contact: { phone: "555-1234" } }
])

MongoDB は、フィールドの存在を確認するための $exists 演算子を提供しています。

  1. 特定のフィールドを持つドキュメントを見つける:
db.students.find({ scholarship: { $exists: true } });

このクエリは、奨学金フィールドを持つ学生を返します。この例では、アリスのドキュメントが返されます。

  1. 特定のフィールドを持たないドキュメントを見つける:
db.students.find({ internship: { $exists: false } });

このクエリは、インターンシップフィールドを持たない学生を返します。これには、アリス、ボブ、デビッドが含まれます。

  1. $exists をネストされたフィールドの確認と組み合わせる:
db.students.find({
  contact: { $exists: true },
  "contact.phone": { $exists: true }
});

これは、連絡先フィールドがあり、その中に電話番号のサブフィールドもあるドキュメントを見つけます。これは、デビッドのドキュメントと一致します。

フィールドの存在に関する要点:

  • $exists: true は、フィールドが存在するかどうかを確認します
  • $exists: false は、フィールドが存在しないかどうかを確認します
  • ネストされたフィールドの存在を確認する複雑なクエリを作成できます

空の値を見つける

このステップでは、MongoDB で空の値を見つけて操作する方法を学び、空の値、未定義の値、欠落したフィールドの違いを理解します。

まず、MongoDB シェルに入っていることを確認します。

mongosh

空の値と未定義の値を含むドキュメントを持つコレクションを作成しましょう。

use school_database

db.students.insertMany([
    { name: "Alice Johnson", age: 22, email: null },
    { name: "Bob Smith", age: null, major: "Mathematics" },
    { name: "Charlie Brown", age: 25, phone: undefined },
    { name: "David Lee", contact: { email: null } }
])

MongoDB は、空の値と未定義の値を照会するための特定の方法を提供しています。

  1. 空の値を持つドキュメントを見つける:
db.students.find({ email: null });

このクエリは、email フィールドが明示的に null に設定されているドキュメントを返します。この例では、アリスのドキュメントが返されます。

  1. 空のフィールドを持つドキュメントを見つける:
db.students.find({ age: null });

これは、age フィールドが特定に null であるドキュメントを見つけます。これにより、ボブのドキュメントが返されます。

  1. ネストされたドキュメント内の空の値を確認する:
db.students.find({ "contact.email": null });

これは、ネストされた contact オブジェクト内の email が null であるドキュメントを見つけます。これは、デビッドのドキュメントと一致します。

  1. 空の値と欠落したフィールドを区別する:
db.students.find({
  $and: [{ phone: null }, { phone: { $exists: true } }]
});

このクエリは、phone フィールドが存在し且つ null であるドキュメントを見つけます。この例では、どのドキュメントも返されません。

空の値に関する要点:

  • null は、オブジェクト値の意図的な欠如を表します
  • 未定義の値 (undefined) とは異なり、変数に値が割り当てられていないことを意味します
  • $exists を使用してフィールドの存在を確認します
  • ネストされたドキュメントの照会には注意が必要です

まとめ

この実験では、$and 演算子と $or 演算子を使って MongoDB コレクションを照会する際に複数の条件を適用する方法を学びました。これにより、データを効果的にフィルタリングするための、より正確で複雑なクエリを作成できます。また、$gte(以上)や $lt(未満)などのさまざまな比較演算子を使って検索条件を絞り込む方法も学びました。さらに、MongoDB コレクション内で正規表現を一致させ、フィールドの存在を確認し、空の値を見つける方法を学びました。これらは、必要なデータを効果的にフィルタリングして取得するための強力なツールを提供します。