Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$rand (operador de expresión)

$rand

Devuelve un número de punto flotante aleatorio entre 0 y 1 cada vez que se llama.

$rand tiene la siguiente sintaxis:

{ $rand: {} }

El operador $rand no acepta argumentos.

Cada vez que se llama a $rand, devuelve un valor de punto flotante que tiene hasta 17 dígitos después del punto decimal. Se descartan los ceros finales, por lo que el número real de dígitos puede variar.

Este ejemplo modela las donaciones benéficas. La colección comienza con una lista de donantes.

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

Utilizamos un pipeline de agregación para actualizar cada documento con una cantidad de donación aleatoria.

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

El primero $set etapa actualiza el campo amount. Se genera un valor inicial entre 0 y 1 utilizando $rand. Luego $multiply lo escala hacia arriba 100 veces.

El $floor operador en la segunda etapa $set remueve la parte decimal de amount dejando un valor entero.

Por último, $merge escribe el valor aleatorio creado en los pasos anteriores en el campo amount, actualizándolo para cada documento en la colección donors.

Puedes ver los resultados con una etapa de proyección:

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

La proyección muestra que los valores escalados son ahora valores aleatorios en el rango de 0 a 99.

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

Puedes usar $rand en una pipeline de agregación para seleccionar documentos aleatorios de una colección. Considera una colección de registros de votantes:

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

Imagina que quieres seleccionar aproximadamente la mitad de los votantes del Distrito 3 para realizar algunas encuestas.

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

La primera etapa de la pipeline compara todos los documentos en los que el votante es del distrito 3.

La segunda etapa $match usa $rand en una expresión de coincidencia para refinar aún más la selección. Para cada documento, $rand genera un valor entre 0 y 1. El umbral de 0.5 en la comparación menor que ($lt) significa que $expr será verdadero para aproximadamente la mitad de los documentos.

En la etapa $project, los documentos seleccionados se filtran para devolver los campos name y registered. Hay 7 votantes en el Distrito 3, ejecutar el código selecciona aproximadamente la mitad de ellos.

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

Nota

El número de documentos seleccionados es diferente cada vez. Si necesitas seleccionar un número exacto de documentos, considera usar $sample en lugar de $rand.

Tip

  • $sample

  • $round

Volver

$radiansToDegrees

En esta página