基本的な MongoDB クエリの書き方

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

はじめに

この実験では、MongoDB の基本的なクエリ技術を学びます。まずデータベースへの接続とデータの挿入から始めます。次に、ドキュメントの取得、完全一致や比較演算子を使用したフィルタリング、返される特定のフィールドの選択、そして結果のソートと制限による出力のフォーマット設定を練習します。この実験の終わりには、MongoDB データベースでのデータクエリに関する確固たる基盤が身につくでしょう。

MongoDB に接続し、すべてのドキュメントを検索する

最初のステップでは、MongoDB サーバーに接続し、データベースとコレクションを作成し、サンプルデータを挿入してから、そのコレクションからすべてのドキュメントを取得します。これは、あらゆるデータベース操作の出発点となります。

まず、ターミナルを開き、mongosh コマンドを実行して MongoDB Shell を起動します。

mongosh

ターミナルのプロンプトが変わり、MongoDB Shell 内に入り、データベースコマンドを実行できる状態になったことを示します。

次に、bookstore という名前の新しいデータベースに切り替えます。データベースが存在しない場合、MongoDB は最初にデータを保存する際にそれを自動的に作成します。

use bookstore

次に、books という名前の新しいコレクションにドキュメントをいくつか挿入しましょう。コレクションは MongoDB ドキュメントのグループであり、リレーショナルデータベースのテーブルに似ています。insertMany() メソッドを使用すると、複数のドキュメントを一度に追加できます。

db.books.insertMany([
  { title: "Python Basics", author: "John Smith", year: 2022, stock: 15 },
  { title: "MongoDB Essentials", author: "Jane Doe", year: 2023, stock: 8 },
  { title: "Web Development", author: "Alice Johnson", year: 2021, stock: 20 }
]);

コマンドを実行すると、ドキュメントが正常に挿入されたことを示す確認メッセージが表示されます。

books コレクション内のすべてのドキュメントを取得して表示するには、引数なしで find() メソッドを使用します。

db.books.find();

出力には、先ほど挿入した 3 つのドキュメントすべてがリストされます。各ドキュメントには _id フィールドがあり、これは MongoDB によって自動的に追加される一意の識別子です。

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  },
  {
    _id: ObjectId("..."),
    title: 'MongoDB Essentials',
    author: 'Jane Doe',
    year: 2023,
    stock: 8
  },
  {
    _id: ObjectId("..."),
    title: 'Web Development',
    author: 'Alice Johnson',
    year: 2021,
    stock: 20
  }
]

完全一致するドキュメントをクエリする

すべてのドキュメントを取得できるようになったので、次は特定のドキュメントを見つけるためにフィルタリングを行います。これは、find() メソッドにクエリフィルタドキュメントを提供することで実行できます。これにより、フィールド値に対して完全一致検索を実行できます。

「Python Basics」というタイトルの書籍を正確に検索してみましょう。クエリフィルタ { title: "Python Basics" } は、title フィールドが正確に「Python Basics」であるドキュメントのみを返すように MongoDB に指示します。

db.books.find({ title: "Python Basics" });

このコマンドは、条件に一致する 1 つのドキュメントのみを返します。

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  }
]

数値などの他のフィールドに基づいてクエリを実行することもできます。たとえば、2021 年に出版されたすべての書籍を見つけるには、次のようになります。

db.books.find({ year: 2021 });

より具体的なクエリを作成するには、フィルタドキュメントで複数のフィールドを指定できます。これにより、暗黙的な「AND」条件が作成されます。つまり、ドキュメントが返されるためには、指定されたすべての条件が真である必要があります。ここでは、「Jane Doe」によって書かれ、かつ 2023 年に出版された書籍を検索してみましょう。

db.books.find({ author: "Jane Doe", year: 2023 });

このクエリは、「MongoDB Essentials」という書籍を返します。これは、著者と年の両方に一致する唯一の書籍だからです。

比較演算子でフィルタリングする

完全一致検索は便利ですが、多くの場合、特定の年以降に出版された書籍や、特定のレベル以上の在庫を持つ書籍を見つけるなど、比較に基づいてドキュメントを検索する必要があります。MongoDB は、この目的のために一連のクエリ演算子を提供しています。

比較演算子は、{ field: { $operator: value } } のような構文を使用してクエリドキュメント内で指定されます。

2021 年以降に出版されたすべての書籍を見つけましょう。「より大きい」演算子である $gt を使用します。

db.books.find({ year: { $gt: 2021 } });

これにより、「Python Basics」(2022 年) と「MongoDB Essentials」(2023 年) が返されます。

その他の一般的な比較演算子をいくつか紹介します。

  • $lt: より小さい (less than)
  • $gte: より大きいか等しい (greater than or equal to)
  • $lte: より小さいか等しい (less than or equal to)
  • $ne: 等しくない (not equal to)

たとえば、在庫が 15 以下のすべての書籍を見つけるには、$lte 演算子を使用できます。

db.books.find({ stock: { $lte: 15 } });

もう 1 つ便利な演算子は $in です。これは、配列で指定された値のいずれかに一致します。「John Smith」または「Alice Johnson」のいずれかによって書かれたすべての書籍を見つけましょう。

db.books.find({ author: { $in: ["John Smith", "Alice Johnson"] } });

このクエリは、「Python Basics」と「Web Development」を返します。演算子を完全一致検索と組み合わせて、より複雑なクエリを作成することもできます。たとえば、2022 年以降に出版され、在庫が 20 未満の書籍を見つけます。

db.books.find({ year: { $gte: 2022 }, stock: { $lt: 20 } });

返却する特定のフィールドを選択する(プロジェクション)

デフォルトでは、MongoDB のクエリは一致するドキュメントのすべてのフィールドを返します。パフォーマンスを向上させ、出力をよりきれいにするために、返されるフィールドを指定できます。これはプロジェクションと呼ばれます。

プロジェクションは、find() メソッドの 2 番目の引数で処理されます。この引数は、フィールドを 1 で含めるか、0 で除外するかを指定するドキュメントです。

すべての書籍を取得し、title フィールドと author フィールドのみを返すようにしましょう。最初の引数 {} は空のフィルタであり、すべてのドキュメントに一致します。

db.books.find({}, { title: 1, author: 1 });

_id フィールドがまだ出力に含まれていることに気づくでしょう。_id フィールドは常にデフォルトで返されます。これを省略するには、明示的に 0 に設定する必要があります。

db.books.find({}, { title: 1, author: 1, _id: 0 });

これで、要求されたフィールドのみを含む、はるかにきれいな出力が得られます。

[
  { "title": "Python Basics", "author": "John Smith" },
  { "title": "MongoDB Essentials", "author": "Jane Doe" },
  { "title": "Web Development", "author": "Alice Johnson" }
]

クエリフィルタとプロジェクションを組み合わせることができます。たとえば、2023 年に出版された書籍を見つけ、そのタイトルのみを返すようにしましょう。

db.books.find({ year: 2023 }, { title: 1, _id: 0 });

この強力な機能により、クエリ結果をアプリケーションが必要とするものに正確に合わせることができ、不要なデータ転送を削減できます。

結果のソート、スキップ、および制限

多くの場合、クエリによって返される結果の順序と数量を制御する必要があります。MongoDB は、結果セット内のドキュメントをソート、スキップ、および制限するために find() クエリにチェーンできるカーソルメソッドを提供します。

結果をソートするには、.sort() メソッドを使用します。これは、ソートするフィールドと方向(昇順の場合は 1、降順の場合は -1)を指定するドキュメントを受け取ります。書籍を年で降順(新しいものから順)にソートしましょう。

db.books.find().sort({ year: -1 });

返されるドキュメントの数を制限するには、.limit() メソッドを使用します。たとえば、最新の書籍の上位 2 件のみを取得するには、次のようにします。

db.books.find().sort({ year: -1 }).limit(2);

.skip() メソッドは、結果セットの先頭から指定された数のドキュメントをバイパスするために使用されます。これは、ページネーションを実装するのに役立ちます。すべての書籍を取得しますが、最初の書籍はスキップします。

db.books.find().sort({ year: 1 }).skip(1);

これらのメソッドをチェーンして、強力で正確なクエリを作成できます。たとえば、コレクション内の 2 番目に古い書籍を見つけるには、年で昇順にソートし、最初 の結果をスキップし、出力を 1 件に制限します。

db.books.find().sort({ year: 1 }).skip(1).limit(1);

このコマンドは、2022 年に出版された「Python Basics」という書籍を返します。

最後に、MongoDB シェルを終了するには、「exit」と入力するか、Ctrl+D を押します。

exit;

まとめ

この実験では、MongoDB で基本的なクエリを作成する際の基本を学びました。mongosh シェルでデータベースに接続し、コレクションにドキュメントを挿入することから始めました。次に、find() を使用してドキュメントを取得し、完全一致や $gt$in のような比較演算子で結果をフィルタリングし、プロジェクションを使用して特定のフィールドを選択することを練習しました。最後に、結果セットの順序とサイズを制御するために、.sort().limit().skip() のようなカーソルメソッドをチェーンして出力をフォーマットする方法を学びました。これらのスキルは、MongoDB でデータと対話し、管理するための基礎となります。