Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

$rand(集計)

項目一覧

  • 定義
  • 動作
$rand

呼び出されるたびに 0 から 1 の間のランダムな浮動小数点数を返します。

$rand の構文は次のとおりです。

{ $rand: {} }

$rand演算子は引数を取りません。

$randが呼び出されるたびに、小数点の後の最大 17 桁までの浮動小数点値が返されます。 後続の 0 は切り捨てられるため、実際の桁数は異なる場合があります。

この例では、正常な貢献をモデル化しています。 コレクションはドナーのリストから始まります。

db.donors.insertMany(
[
{ donorId: 1000, amount: 0, frequency: 1 },
{ donorId: 1001, amount: 0, frequency: 2 },
{ donorId: 1002, amount: 0, frequency: 1 },
{ donorId: 1003, amount: 0, frequency: 2 },
{ donorId: 1004, amount: 0, frequency: 1 }
]
)

集計パイプラインを使用して、各ドキュメントをランダムなド金額で更新します。

db.donors.aggregate(
[
{ $set: { amount: { $multiply: [ { $rand: {} }, 100 ] } } },
{ $set: { amount: { $floor: "$amount" } } },
{ $merge: "donors" }
]
)

最初の $setステージはamountフィールドを更新します。 0と1の間の初期値は$randを使用して生成されます。 次に、 $multiplyはそれを100回スケールアップします。

2 番目の$setステージの$floor演算子は、 amountから小数部分を削除して整数値を残ります。

最後に、 $mergeは前の手順で作成されたランダム値をamountフィールドに書き込み、 donorsコレクション内の各ドキュメントに対して更新します。

プロジェクション ステージで結果を表示できます。

db.donors.aggregate(
[
{ $project: {_id: 0, donorId: 1, amount: 1 } }
]
)

プロジェクションでは、スケーリングされた量が 0 から 99 の範囲のランダム値になることが示されています。

{ "donorId" : 1000, "amount" : 27 }
{ "donorId" : 1001, "amount" : 10 }
{ "donorId" : 1002, "amount" : 88 }
{ "donorId" : 1003, "amount" : 73 }
{ "donorId" : 1004, "amount" : 5 }

集計パイプラインで$randを使用して、コレクションからランダムなドキュメントを選択できます。 投票者レコードのコレクションを検討します。

db.voters.insertMany(
[
{ name: "Archibald", voterId: 4321, district: 3, registered: true },
{ name: "Beckham", voterId: 4331, district: 3, registered: true },
{ name: "Carolin", voterId: 5321, district: 4, registered: true },
{ name: "Debarge", voterId: 4343, district: 3, registered: false },
{ name: "Eckhard", voterId: 4161, district: 3, registered: false },
{ name: "Faberge", voterId: 4300, district: 1, registered: true },
{ name: "Grimwald", voterId: 4111, district: 3, registered: true },
{ name: "Humphrey", voterId: 2021, district: 3, registered: true },
{ name: "Idelfon", voterId: 1021, district: 4, registered: true },
{ name: "Justo", voterId: 9891, district: 3, registered: false }
]
)

たとえば、選挙区 3 の投票者の約半分を選択してポーリングを実行したいとします。

db.voters.aggregate(
[
{ $match: { district: 3 } },
{ $match: { $expr: { $lt: [0.5, {$rand: {} } ] } } },
{ $project: { _id: 0, name: 1, registered: 1 } }
]
)

最初のパイプライン ステージは、投票者が地区 3 のすべてのドキュメントと一致します。

2 番目の$matchステージでは、選択をさらに絞り込むために、マッチ式で$randを使用します。 各ドキュメントに対して、 $randは 0 から 1 の間の値を生成します。 ($lt)未満の比較で0.5のしきい値がある場合、ドキュメントの約半分に対して$exprが true になることを意味します。

$projectステージでは、選択したドキュメントがフィルタリングされ、name registeredフィールドと フィールドが返されます。地区 3 の投票者は 7 人で、コードを実行するとその約半数が選択されます。

{ "name" : "Archibald", "registered" : true }
{ "name" : "Debarge", "registered" : false }
{ "name" : "Humphrey", "registered" : true }

注意

選択されるドキュメントの数は毎回異なります。 正確な数のドキュメントを選択する必要がある場合は、 $randの代わりに$sampleを使用することを検討してください。

Tip

以下も参照してください。

  • $rand (query)

  • $sample

  • $round

戻る

$radiansToDegrees

項目一覧