MongoDB の結果のソートと制限

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

はじめに

この実験では、データベース結果のソート、制限、フィルタリングのための基本的な MongoDB クエリテクニックを学びます。これらのスキルは、データを効率的に管理および取得するために不可欠です。サンプルドキュメントコレクションに対してこれらの操作を実行するために、MongoDB シェル (mongosh) を使用します。

この実験では、単一または複数のフィールドでドキュメントをソートする方法、制限とオフセットを使用して返される結果の数を制御する方法、および特定の基準に一致するドキュメントをカウントする方法を説明します。この実験の終わりまでに、MongoDB データベースからデータを整理および取得する方法について確固たる理解を得ることができます。

単一フィールドでドキュメントをソートする

このステップでは、MongoDB コレクション内のドキュメントをソートする方法を学びます。ソートにより、クエリ結果を特定の順序で整理できます。これは、データ分析やプレゼンテーションに不可欠です。環境は、books コレクションを含む bookstore データベースで事前に設定されています。

まず、MongoDB シェルを開いてデータベースと対話します。ターミナルで次のコマンドを実行します。

mongosh

シェルに入ったら、bookstore データベースに切り替えます。

use bookstore

books コレクション内のドキュメントを表示するには、find() メソッドを使用できます。

db.books.find();

次に、これらのドキュメントをソートしましょう。単一フィールドでソートするには、find() クエリに .sort() メソッドをチェーンします。sort() メソッドは、ソートするフィールドと方向(昇順の場合は 1、降順の場合は -1)を指定するオブジェクトを受け取ります。

ページ数で書籍を昇順(ページ数が少ない順)にソートしてみましょう。

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

ページ数が最も少ない「Python Basics」が最初にリストされているのがわかります。

[
  {
    _id: ObjectId('...'),
    title: 'Python Basics',
    pages: 250,
    price: 29.99
  },
  {
    _id: ObjectId('...'),
    title: 'MongoDB Fundamentals',
    pages: 300,
    price: 34.99
  },
  ...
]

次に、価格で書籍を降順にソートして、最も高価なものを先に表示しましょう。

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

このコマンドは、「Data Science」が最も高価であるため、最初に表示されます。

[
  {
    _id: ObjectId('...'),
    title: 'Data Science',
    pages: 350,
    price: 44.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  ...
]

複数フィールドでソートする

単一フィールドでのソートだけでは不十分な場合があります。MongoDB では、より詳細な順序付けを作成するために、ソート用の複数のキーを指定できます。このステップでは、フィールドのシーケンスに基づいてドキュメントをソートする方法を学びます。

複数キーソートをより良く示すために、コレクションにいくつかの書籍を追加しましょう。これらの新しい書籍は既存の書籍と同じ価格ですが、ページ数が異なります。

db.books.insertMany([
  { title: "Machine Learning", pages: 420, price: 39.99 },
  { title: "Web Development", pages: 380, price: 39.99 }
]);

これで、価格が $39.99 の書籍が 3 冊になりました。価格だけでソートした場合、これら 3 冊の書籍の順序は保証されません。予測可能な順序を作成するために、2 番目のソートキーを追加できます。

まず price で昇順に書籍をソートし、次に同じ価格の書籍については pages で降順にソートしてみましょう。

db.books.find().sort({ price: 1, pages: -1 });

クエリプロセッサは、まずすべてのドキュメントを price でソートします。次に、同じ price を持つドキュメント(例:$39.99 の 3 冊の書籍)については、それらを pages で降順にソートします。

$39.99 の書籍に対する出力は、次の順序で表示されるはずです。

  1. "Machine Learning" (420 ページ)
  2. "JavaScript Advanced" (400 ページ)
  3. "Web Development" (380 ページ)
[
  ...,
  {
    _id: ObjectId('...'),
    title: 'Machine Learning',
    pages: 420,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  },
  ...
]

このテクニックは、ユーザーインターフェースやレポートのために複雑で安定したソートを作成するのに役立ちます。

結果の制限とスキップ

大規模なデータセットを扱う場合、結果のサブセットのみを取得する必要があることがよくあります。MongoDB は、この目的のために .limit() および .skip() メソッドを提供します。これらを組み合わせることで、ページネーションの実装の基礎となります。

.limit() メソッドは、クエリによって返されるドキュメントの数を制限します。最も高価な書籍の上位 3 冊のみを取得してみましょう。

db.books.find().sort({ price: -1 }).limit(3);

このコマンドは、まずすべての書籍を価格の降順でソートし、次にソートされたリストから最初の 3 つのドキュメントのみを返します。

.skip() メソッドは、カーソルに結果セットの先頭から指定された数のドキュメントを無視するように指示します。これは、データのページをナビゲートするのに役立ちます。

たとえば、各ページに 2 冊の書籍がある結果の 2 ページ目を取得するには、最初の 2 冊の書籍をスキップし、結果を 2 に制限します。これを価格でソートされたリストに適用して、3 番目と 4 番目に高価な書籍を取得しましょう。

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

このクエリは、次のアクションを順番に実行します。

  1. sort({ price: -1 }): すべての書籍を最も高価なものから最も安価なものへとソートします。
  2. skip(2): 最も高価な上位 2 冊の書籍をスキップします。
  3. limit(2): リストから次の 2 冊の書籍を返します。

出力には、ソートされたリストの 3 番目と 4 番目の書籍が表示されます。

[
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  }
]

skip() および limit() の値を調整することで、完全なページネーションシステムを実装できます。

ドキュメントのカウント

別の一般的な要件は、コレクション内のドキュメントの総数、または特定のフィルターに一致するドキュメントの数をカウントすることです。MongoDB はこの目的のために countDocuments() メソッドを提供します。

コレクション内の書籍の総数を取得するには、次のコマンドを実行します。

db.books.countDocuments();

これにより、ドキュメントの総数が返されます。ステップ 2 からの追加後、これは 6 になるはずです。

さらに強力な点として、countDocuments() はクエリフィルターを受け入れることができ、特定の基準に一致するドキュメントのみをカウントできます。価格が 35 ドルを超える書籍がいくつあるか数えてみましょう。このために $gt (greater than) クエリ演算子を使用します。

db.books.countDocuments({ price: { $gt: 35 } });

これにより、価格が 35 より大きい書籍の数が返されます。

フィルターで複数の条件を使用することもできます。価格が正確に $39.99 で、ページ数が 400 以上である書籍を数えてみましょう。ここでは $gte (greater than or equal to) 演算子を使用します。

db.books.countDocuments({ price: 39.99, pages: { $gte: 400 } });

このコマンドは 2 を返します。これは、「Machine Learning」(420 ページ)と「JavaScript Advanced」(400 ページ)に対応します。フィルターと共に countDocuments() を使用することは、ドキュメント自体を取得せずにデータに関する統計情報を取得するための効率的な方法です。

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

exit;

まとめ

この実験では、いくつかの基本的な MongoDB クエリ技術を学びました。まず、.sort() メソッドを使用して、単一フィールドで昇順および降順にドキュメントをソートしました。次に、より複雑で安定した結果の順序付けを可能にするマルチキーソートに進みました。

次に、.limit() を使用して返されるドキュメントの数を制限し、.skip() を使用してページネーションを実装することで、結果セットのサイズを制御する方法を探索しました。最後に、countDocuments() を使用して、コレクション全体および特定のフィルター基準に一致するドキュメントの両方を効率的にカウントする方法を学びました。これらのコマンドは、MongoDB を扱うすべての開発者にとって基本的なツールです。