MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでランダムなレコードを取得する方法|$sampleステージの使い方

MongoDBでランダムなレコードを取得する方法

MongoDBからランダムなレコード(ドキュメント)を取得したい場合は、集計フレームワーク(Aggregation Pipeline)の$sampleステージを使うのが最も簡単です。基本の構文は次の通りです。

db.yourCollectionName.aggregate([{$sample:{size:1}}]);

$sampleステージは、コレクション内から指定した件数のドキュメントをランダムに抽出します。sizeには取得したい件数を指定します。ここでは1件だけ取得するため「size:1」としています。

サンプルコレクションの作成

実際の動作を確認するために、まずは社員情報を格納するコレクションを作成し、いくつかのドキュメントを挿入してみましょう。作成用のクエリは以下の通りです。なお、MongoDBの新しいバージョンではinsertOne()insertMany()の使用が推奨されています。

> db.employeeInformation.insert({"EmployeeId":1,"EmployeeName":"Maxwell","EmployeeAge":26});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":2,"EmployeeName":"David","EmployeeAge":25});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":3,"EmployeeName":"Carol","EmployeeAge":24});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":4,"EmployeeName":"Bob","EmployeeAge":28});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":5,"EmployeeName":"Sam","EmployeeAge":27});
WriteResult({ "nInserted" : 1 })

登録済みドキュメントの確認

find()メソッドを使えば、コレクション内のすべてのドキュメントを表示できます。pretty()を付けると出力が整形され、読みやすくなります。

> db.employeeInformation.find().pretty();

実行結果は以下の通りです。5件の社員情報が正しく登録されていることがわかります。

{
    "_id" : ObjectId("5c6d3079734e98fc0a434ae5"),
    "EmployeeId" : 1,
    "EmployeeName" : "Maxwell",
    "EmployeeAge" : 26
}
{
    "_id" : ObjectId("5c6d308c734e98fc0a434ae6"),
    "EmployeeId" : 2,
    "EmployeeName" : "David",
    "EmployeeAge" : 25
}
{
    "_id" : ObjectId("5c6d309d734e98fc0a434ae7"),
    "EmployeeId" : 3,
    "EmployeeName" : "Carol",
    "EmployeeAge" : 24
}
{
    "_id" : ObjectId("5c6d30ab734e98fc0a434ae8"),
    "EmployeeId" : 4,
    "EmployeeName" : "Bob",
    "EmployeeAge" : 28
}
{
    "_id" : ObjectId("5c6d30bb734e98fc0a434ae9"),
    "EmployeeId" : 5,
    "EmployeeName" : "Sam",
    "EmployeeAge" : 27
}

ランダムなレコードを取得するクエリ

それでは、$sampleステージを使ってランダムに1件のレコードを取得してみましょう。クエリは次の通りです。

> db.employeeInformation.aggregate([{$sample:{size:1}}]).pretty();

実行結果:

{
    "_id" : ObjectId("5c6d30bb734e98fc0a434ae9"),
    "EmployeeId" : 5,
    "EmployeeName" : "Sam",
    "EmployeeAge" : 27
}

同じクエリをもう一度実行すると、今度は別のドキュメントが返されます。実行するたびに異なるレコードがランダムに選択されていることが確認できます。

> db.employeeInformation.aggregate([{$sample:{size:1}}]).pretty();

実行結果:

{
    "_id" : ObjectId("5c6d308c734e98fc0a434ae6"),
    "EmployeeId" : 2,
    "EmployeeName" : "David",
    "EmployeeAge" : 25
}

$sampleステージを使う際のポイント

  • sizeの値を変更すれば、複数件のランダムなレコードも一度に取得できます(例:{$sample:{size:5}})。
  • 結果は実行のたびに変わるため、テストデータの生成や「今日のピックアップ」のような機能に活用できます。
  • 大規模なコレクションに対して$sampleを実行すると、内部でスキャン処理が発生する場合があり、パフォーマンスに影響することがあります。大量データを扱う場合は注意が必要です。
  1. MySQLのレコードから数字を抽出する方法:CONVERT関数の実践的な使い方

    MySQLでレコードから数字を抽出する方法 「John-11」のような文字列が保存されたカラムから、数字の部分だけを取り出したいケースはよくあります。そんなときは CONVERT() 関数や正規表現を活用しましょう。CONVERT() は値をあるデータ型から別のデータ型へ変換するための関数で、これを利用することで文字列中の数字部分を数値として取得できます。 本記事では、テーブルの作成から数字の抽出・並べ替えまでを、実際のSQL例とともに順を追って解説します。 ステップ1:テーブルを作成する まずはサンプル用のテーブルを作成します。 mysql> create table textInt

  2. MySQLでランダムなレコードを取得する方法|ORDER BY RAND()の使い方を解説

    MySQLデータベースからランダムにレコードを1件(または複数件)取得したい場合、ORDER BY RAND() と LIMIT を組み合わせるのが最もシンプルな方法です。この記事では、実際のテーブル作成からランダム抽出までの手順を、実行例とともにわかりやすく解説します。1. サンプルテーブルを作成するまずは動作確認用のテーブルを作成しましょう。ここでは学生情報を管理するテーブルを定義します。mysql> create table DemoTable1581    -> (    -> Stude