Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$rand (agregação)

Nesta página

  • Definição
  • Comportamento
  • Exemplos
$rand

Retorna um flutuação aleatório entre 0 e 1 cada vez que é chamado.

$rand tem a seguinte sintaxe:

{ $rand: {} }

O operador $rand não utiliza quaisquer argumentos.

Cada vez que $rand é chamado, ele retornará um valor de ponto flutuante com até 17 dígitos após o ponto decimal. Os 0s finais são eliminados, portanto o número real de dígitos pode variar.

Este exemplo modela doações beneficentes. A coleção começa com uma lista de doadores.

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 }
]
)

Usamos um aggregation pipeline para atualizar cada documento com um valor de doação aleatório.

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

O primeiro estágio do $set atualiza o campo amount. Um valor inicial entre 0 e 1 é gerado utilizando $rand. Em seguida, $multiply aumenta 100 vezes.

O operador $floor no segundo estágio $set remove a parte decimal do amount para deixar um valor inteiro.

Finalmente, $merge grava o valor aleatório criado nas etapas anteriores no campo amount, atualizando-o para cada documento na coleção donors.

Você pode visualizar os resultados com um estágio de projeção:

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

A projeção mostra que as quantidades dimensionadas são agora valores aleatórios no intervalo de 0 a 99.

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

Você pode usar o $rand em um aggregation pipeline para selecionar documentos aleatórios de uma coleção. Considere uma coleção de registros de eleitores:

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 }
]
)

Imagine que você queira selecionar cerca de metade dos eleitores do Distrito 3 para fazer algumas pesquisas.

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

O primeiro estágio do pipeline corresponde a todos os documentos onde o eleitor é da zona 3.

O segundo estágio $match usa $rand em uma expressão de correspondência para refinar ainda mais a seleção. Para cada documento, o $rand gera um valor entre 0 e 1. O limite de 0.5 na comparação menor que ($lt) significa que $expr será verdadeiro para cerca de metade dos documentos.

No estágio $project, os documentos selecionados são filtrados para retornar os campos name e registered. Há 7 eleitores no Distrito 3. A execução do código seleciona cerca de metade deles.

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

Observação

O número de documentos selecionados é diferente a cada vez. Se você precisar selecionar um número exato de documentos, considere usar $sample em vez de $rand.

Dica

Veja também:

← $radiansToDegrees (agregação)