Definición
Comportamiento
Cada vez que se llama a $rand, se devuelve un valor de punto flotante con hasta 17 dígitos después del punto decimal. Los 0finales se omiten, por lo que el número real de dígitos puede variar.
Ejemplos
Generar puntos de datos aleatorios
Este ejemplo modela 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" } ] )
La primera 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.
Finalmente, escribe el valor aleatorio creado en los pasos anteriores en$merge el amount campo, actualizándolo para cada documento de la donors colección.
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 }
Seleccionar elementos aleatorios de una colección
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 una encuesta.
db.voters.aggregate( [ { $match: { district: 3 } }, { $match: { $expr: { $lt: [0.5, {$rand: {} } ] } } }, { $project: { _id: 0, name: 1, registered: 1 } } ] )
La primera etapa del proceso de selección coincide con todos los documentos en los que el votante es del distrito 3.
La segunda etapa $match utiliza $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 1y. El umbral de 0.5 en la comparación inferior ($lt) a significa que será válido para aproximadamente la mitad de los $expr documentos.
En la etapa, los documentos seleccionados se filtran para devolver los $project campos name registered y. Hay 7 votantes en el Distrito;3 al ejecutar el código, se seleccionan aproximadamente la mitad.
{ "name" : "Archibald", "registered" : true } { "name" : "Debarge", "registered" : false } { "name" : "Humphrey", "registered" : true }
Nota
El número de documentos seleccionados varía cada vez. Si necesita seleccionar un número exacto, considere usar en $sample lugar $rand de.