MongoDBコレクションからランダムに2つのドキュメントを取得する方法
MongoDBでコレクション内のドキュメントからランダムなデータを取得したい場面は少なくありません。例えば、テスト用のサンプルデータ抽出や、くじ引きのような機能を実装するケースなどが挙げられます。
MongoDBでは、集計パイプライン(aggregation pipeline)の $sample ステージを使うことで、コレクションからランダムに任意の件数のドキュメントを簡単に取得できます。本記事では、6つのドキュメントを持つコレクションからランダムに2つのドキュメントを取り出す手順を、具体例とともに解説します。
1. コレクションの作成とドキュメントの登録
まずは、insertOne() メソッドを使用してコレクションを作成し、6つのドキュメントを登録します。ここでは学生ID(StudentId)を持つシンプルなドキュメントを扱います。
> db.twoRandomDocumentDemo.insertOne({"StudentId":10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ec9aad628fa4220163b87")
}
> db.twoRandomDocumentDemo.insertOne({"StudentId":100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ec9add628fa4220163b88")
}
> db.twoRandomDocumentDemo.insertOne({"StudentId":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ec9b0d628fa4220163b89")
}
> db.twoRandomDocumentDemo.insertOne({"StudentId":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ec9b3d628fa4220163b8a")
}
> db.twoRandomDocumentDemo.insertOne({"StudentId":5});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ec9b7d628fa4220163b8b")
}
> db.twoRandomDocumentDemo.insertOne({"StudentId":7});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ec9bad628fa4220163b8c")
}2. 登録した全ドキュメントを確認する
次に、find() メソッドを使って、コレクション内のすべてのドキュメントを表示して確認しましょう。
> db.twoRandomDocumentDemo.find();
上記のクエリを実行すると、以下のように6つのドキュメントが出力されます。
{ "_id" : ObjectId("5c9ec9aad628fa4220163b87"), "StudentId" : 10 }
{ "_id" : ObjectId("5c9ec9add628fa4220163b88"), "StudentId" : 100 }
{ "_id" : ObjectId("5c9ec9b0d628fa4220163b89"), "StudentId" : 45 }
{ "_id" : ObjectId("5c9ec9b3d628fa4220163b8a"), "StudentId" : 55 }
{ "_id" : ObjectId("5c9ec9b7d628fa4220163b8b"), "StudentId" : 5 }
{ "_id" : ObjectId("5c9ec9bad628fa4220163b8c"), "StudentId" : 7 }3. $sample を使ってランダムに2つのドキュメントを取得する
いよいよ本題です。aggregate() メソッドと $sample ステージを組み合わせることで、ランダムなドキュメントを取得できます。$sample の size オプションには取得したいドキュメント数を指定します。今回は2つだけ欲しいので 2 を設定します。
> db.twoRandomDocumentDemo.aggregate([{$sample: {size: 2}}]);実行結果の例は以下の通りです。実行するたびに異なる組み合わせのドキュメントが返される点に注目してください。
{ "_id" : ObjectId("5c9ec9b3d628fa4220163b8a"), "StudentId" : 55 }
{ "_id" : ObjectId("5c9ec9aad628fa4220163b87"), "StudentId" : 10 }4. 再実行すると結果が変わることを確認
同じクエリをもう一度実行してみましょう。ランダム抽出であるため、先ほどとは別のドキュメントが取得されます。
> db.twoRandomDocumentDemo.aggregate([{$sample: {size: 2}}]);出力結果:
{ "_id" : ObjectId("5c9ec9add628fa4220163b88"), "StudentId" : 100 }
{ "_id" : ObjectId("5c9ec9b7d628fa4220163b8b"), "StudentId" : 5 }まとめ
MongoDBでランダムなドキュメントを取得するには、$sample 集計ステージが最も手軽で効率的な方法です。ポイントは以下の通りです。
$sample: { size: N }の形式で、取得したいドキュメント数 N を指定できる- 実行するたびに異なるドキュメントがランダムに返される
- 大量のコレクションに対してもMongoDBが最適化された形でランダム抽出を行ってくれる
サンプルデータの抽出やランダム表示機能など、さまざまな用途で活用できるので、ぜひ実際のプロジェクトでも試してみてください。
-
MongoDBで2階層の深さにネストされたレコードを検索する方法
MongoDBで2階層の深さにネストされたフィールドを持つレコードを検索したい場合、$where 演算子とJavaScript関数を組み合わせることで実現できます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。サンプルコレクションの作成まず、検索対象となるドキュメントを含むコレクションを作成します。ここでは「FirstPosition」と「SecondPosition」という2つのネストされたオブジェクトを持つドキュメントを挿入します。> db.demo468.insertOne( ... { ... _id : new ObjectId(), ... F
-
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。まずは、サンプルとなるコレクションとドキュメントを作成してみましょう。サンプルコレクションの作成insertOne()メソッドを使用して、ドキュメントを1件ずつ挿入します。> db.demo712.insertOne({Name:John}); { acknowledged : true, insertedId : ObjectId(5ea85f675d33e20ed1