MongoDB コレクションのフィルタリング

MongoDBBeginner
オンラインで実践に進む

はじめに

この実験では、さまざまなクエリテクニックを使用して MongoDB コレクションを効果的にフィルタリングする方法を学びます。この実験では、複数の条件の適用、比較演算子の使用、正規表現によるマッチング、フィールドの存在チェック、および null 値の検索について説明します。これらのスキルは、MongoDB での正確なデータ取得に不可欠です。ステップバイステップの指示は、MongoDB クエリの基本を習得するのに役立つ実践的な例を提供します。

複数条件の適用

このステップでは、MongoDB コレクション内のドキュメントをフィルタリングするために複数の条件を適用する方法を学びます。これにより、いくつかの基準を組み合わせることで、より正確なクエリが可能になります。

まず、ターミナルを開き、MongoDB Shell を起動します。このインタラクティブシェルで、すべてのデータベースコマンドを実行します。

mongosh

mongoshシェルに入ると、>プロンプトが表示されます。school_databaseという新しいデータベースに切り替え、いくつかのサンプルデータを持つstudentsコレクションを作成しましょう。

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" }
]);

このコマンドは、studentsコレクションに 4 つのドキュメントを挿入します。次に、複数の条件を満たす学生を見つけましょう。ここでは、$and演算子を使用して、20 歳以上かつ成績が「A」である学生を見つけます。

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

このクエリは、「より大きいか等しい」を意味する$gteと、両方の条件が満たされることを保証する$andを使用しています。出力は Alice と Charlie を表示します。

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

次に、$or演算子を使用して、複数の条件の少なくとも 1 つに一致するドキュメントを見つけます。このクエリは、「Computer Science」を専攻しているまたは21 歳未満の学生を見つけます。

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

このクエリは、「より小さい」を意味する$ltを使用しています。結果には、Alice と David(Computer Science 専攻)および Bob と David(21 歳未満)が含まれます。David は両方に一致するため、一度だけ表示されます。

[
  {
    _id: ObjectId("..."),
    name: 'Alice',
    age: 22,
    grade: 'A',
    major: 'Computer Science'
  },
  {
    _id: ObjectId("..."),
    name: 'Bob',
    age: 20,
    grade: 'B',
    major: 'Mathematics'
  },
  {
    _id: ObjectId("..."),
    name: 'David',
    age: 19,
    grade: 'C',
    major: 'Computer Science'
  }
]

次のステップでは、さらに多くの比較演算子を探索します。今のところ、mongoshシェル内にいても構いません。

比較演算子の使用

このステップでは、MongoDB の比較演算子を使用して、より高度なクエリを構築します。これらの演算子を使用すると、値の比較に基づいてデータをフィルタリングできます。

前のステップから引き続き、mongoshシェル内にいるはずです。まず、既存のコレクションをクリアし、作業用のcreditsフィールドを持つ新しいデータを挿入しましょう。

db.students.drop();
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 }
]);

次に、「より大きい」($gt)および「より小さい」($lt)演算子を使用して、20 歳より上で 25 歳未満の学生を見つけます。

db.students.find({ age: { $gt: 20, $lt: 25 } });

このクエリは、22 歳の Alice のドキュメントのみを返します。

次に、「より大きいか等しい」($gte)および「より小さいか等しい」($lte)を使用して、クレジットが 40 から 50(両端を含む)の間の学生を見つけます。

db.students.find({ credits: { $gte: 40, $lte: 50 } });

このクエリは、Alice(45 クレジット)と Charlie(50 クレジット)を返します。

最後に、「等しくない」($ne)演算子を使用して、成績が「C」ではないすべての学生を見つけます。

db.students.find({ grade: { $ne: "C" } });

これにより、成績が「C」の David を除き、Alice、Bob、Charlie が返されます。これらの演算子は、MongoDB で詳細かつ具体的なクエリを作成するための基本となります。

正規表現による一致

正規表現(regex)は、強力なテキスト検索を柔軟に行うための方法を提供します。このステップでは、MongoDB クエリで正規表現を使用する方法を学びます。

まず、このステップのためのデータを準備しましょう。コレクションをクリアし、より詳細な文字列フィールドを持つ新しいドキュメントを挿入します。

db.students.drop();
db.students.insertMany([
  {
    name: "Alice Johnson",
    age: 22,
    major: "Computer Science",
    email: "alice.j@example.com"
  },
  {
    name: "Bob Smith",
    age: 20,
    major: "Mathematics",
    email: "bob.smith@university.edu"
  },
  {
    name: "Charlie Brown",
    age: 25,
    major: "Physics",
    email: "charlie.brown@school.org"
  },
  {
    name: "David Lee",
    age: 19,
    major: "Computer Engineering",
    email: "david.lee@tech.net"
  }
]);

名前に「Alice」で始まるすべての学生を見つけるには、^アンカーを使用した$regex演算子を使用できます。

db.students.find({ name: { $regex: "^Alice" } });

このクエリは、「Alice Johnson」のドキュメントを返します。^文字は文字列の先頭を示します。

特定のドメイン(例:example.com)からのメールアドレスを持つ学生を見つけるには、$アンカーを使用して文字列の末尾にマッチさせます。

db.students.find({ email: { $regex: "@example.com$" } });

これにより、メールアドレスが@example.comで終わる「Alice Johnson」が見つかります。

大文字・小文字を区別しない検索も実行できます。次のクエリは、iオプションを使用することで、大文字・小文字を区別せずに名前に「smith」が含まれる学生をすべて見つけます。

db.students.find({ name: { $regex: "smith", $options: "i" } });

このクエリは、「Bob Smith」にマッチします。

最後に、「Computer」という単語を含む任意の専攻を見つけるには、アンカーなしの単純な正規表現パターンを使用できます。

db.students.find({ major: { $regex: "Computer" } });

これにより、「Alice Johnson」(Computer Science)と「David Lee」(Computer Engineering)の両方が返されます。

フィールドの存在確認

コレクション内のドキュメントは、構造が異なる場合があります。このステップでは、特定のフィールドが存在するかどうかに基づいてドキュメントをクエリする方法を学びます。

まず、いくつかのフィールドが欠落している新しいドキュメントセットを挿入することから始めましょう。

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

scholarshipフィールドを持つすべての学生を見つけるには、$exists演算子にtrueの値を指定して使用します。

db.students.find({ scholarship: { $exists: true } });

このクエリは、scholarshipフィールドを持っているのはアリスだけなので、アリスのドキュメントのみを返します。

逆に、internshipフィールドを持っていない学生を見つけるには、$existsfalseに設定します。

db.students.find({ internship: { $exists: false } });

これにより、アリス、ボブ、デイビッドのドキュメントが返されます。これらのいずれもinternshipフィールドを持っていません。

$exists演算子は、ネストされたフィールドにも機能します。phoneフィールドを含むcontactオブジェクトを持つ学生を見つけるには、ドット表記を使用できます。

db.students.find({ "contact.phone": { $exists: true } });

このクエリは、contactオブジェクト内のphoneフィールドを specifically 検索し、デイビッドのドキュメントを返します。

Null 値の検索

この最後のステップでは、null 値を含むドキュメントをクエリする方法を学びます。null 値は、値が意図的に存在しないことを表します。

まず、null 値や欠落フィールドを含むドキュメントを持つコレクションを設定しましょう。

db.students.drop();
db.students.insertMany([
  { name: "Alice", age: 22, email: null },
  { name: "Bob", age: 20, major: "Mathematics" },
  { name: "Charlie", age: null, major: "Physics" },
  { name: "David", contact: { email: null } }
]);

フィールドに null 値があるドキュメントを見つけるには、直接 null をクエリできます。次のクエリは、email フィールドが null であるか、または email フィールドが存在しないすべてのドキュメントを検索します。

db.students.find({ email: null });

このクエリは、Alice(email が明示的に null)、Bob(email フィールドが存在しない)、Charlie(email フィールドが存在しない)、および David(email フィールドが存在しない)の 4 つのドキュメントすべてを返します。

フィールドが明示的に null に設定されているドキュメントのみを見つけるには、null チェックと $exists チェックを組み合わせる必要があります。

db.students.find({ email: { $type: "null" } });

または、$type オペレーターを使用することもできます。null の BSON 型は 10 です。このクエリは Alice のドキュメントのみを返します。

db.students.find({ email: { $type: 10 } });

ネストされたドキュメント内の null 値をクエリすることもできます。次のクエリは、contact オブジェクト内の email フィールドが null であるか、または contact フィールドが存在しないドキュメントを検索します。

db.students.find({ "contact.email": null });

これは、Alice、Bob、および Charlie(contact フィールドが存在しない)、および David(contact.email が明示的に null)の 4 つのドキュメントすべてを返します。null のクエリ方法を理解することは、不完全またはスパースなデータを処理するために不可欠です。

終了したら、exit と入力するか Ctrl+D を押して mongosh シェルを終了できます。

まとめ

この実験では、MongoDB でコレクションをフィルタリングするためのいくつかの重要なテクニックを学びました。$andおよび$or演算子を使用して複数の条件を適用する練習を行い、これにより複雑で正確なクエリを作成できます。また、$gt$lt$neなどのさまざまな比較演算子を使用して検索基準を絞り込む方法を探りました。さらに、正規表現を使用してテキストを一致させ、$existsでフィールドの存在を確認し、null値をクエリする経験を積みました。これらのスキルは、MongoDB での効果的なデータ取得と操作のための強固な基盤を提供します。