Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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 no acepta ningún $rand argumento.

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 proceso de agregación para actualizar cada documento con un monto de donación aleatorio.

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

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

El operador en la $floor segunda $set etapa elimina la parte decimal de amount para dejar 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 visualizar los resultados con una etapa de proyección:

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

La proyección muestra que las cantidades escaladas ahora son 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 }

Puede usar $rand en una secuencia de agregación para seleccionar documentos aleatorios de una colección. Considere 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