Tengo una colección mongo con documentos. Hay un campo en cada documento que es 0 O 1. Necesito muestrear aleatoriamente 1000 registros de la base de datos y contar el número de documentos que tienen ese campo como 1. Necesito hacer este muestreo 1000 veces. Cómo lo hago ?Muestreo aleatorio de Mongo
Respuesta
He aquí un ejemplo en la cáscara mongo
.. suponiendo una colección de collname
, y un valor de interés en thefield
:
var total = db.collname.count();
var count = 0;
var numSamples = 1000;
for (i = 0; i < numSamples; i++) {
var random = Math.floor(Math.random()*total);
var doc = db.collname.find().skip(random).limit(1).next();
if (doc.thefield) {
count += (doc.thefield == 1);
}
}
Esto también responde a otra pregunta: que a diferencia de SQL, MongoDB no tiene una función incorporada para esto realmente.También ese omisión podría (... podría) ser problemático para valores aleatorios más grandes, sin embargo depende. – Sammaye
que iba a editar mi comentario sobre @Stennies contesto con esto, pero también se podría use un índice de ID de aumento automático seprate aquí como alternativa si omitiera GRANDES cantidades de registro (hablando mucho aquí).
me escribió otra respuesta a otra pregunta mucho como este en el que alguien estaba tratando de encontrar el registro número n de la colección:
php mongodb find nth entry in collection
La segunda parte de mi respuesta describe básicamente un método potencial cuál podría abordar este problema Todavía necesitarías repetir 1000 veces para obtener la fila aleatoria del curso.
Para MongoDB 3.0 y anteriores, utilizo un viejo truco de los días de SQL (que creo que Wikipedia usa para su función de página aleatoria). Guardo un número aleatorio entre 0 y 1 en cada objeto que necesito aleatorizar, llamemos a ese campo "r". Luego agrega un índice en "r".
db.coll.ensureIndex(r: 1);
Ahora para obtener x objetos al azar, que utilice:
var startVal = Math.random();
db.coll.find({r: {$gt: startVal}}).sort({r: 1}).limit(x);
Esto le da objetos al azar en una sola consulta de búsqueda. Dependiendo de sus necesidades, esto puede ser excesivo, pero si va a hacer un montón de muestreo en el tiempo, esta es una forma muy eficiente sin poner carga en su back-end.
¡Genial! ¡Muy inteligente! –
¡solución elegante! –
Si está utilizando mongoengine, puede usar un SequenceField para generar un contador incremental.
class User(db.DynamicDocument):
counter = db.SequenceField(collection_name="user.counters")
A continuación, en busca de una lista aleatoria de, digamos, 100, haga lo siguiente
def get_random_users(number_requested):
users_to_fetch = random.sample(range(1, User.objects.count() + 1), min(number_requested, User.objects.count()))
return User.objects(counter__in=users_to_fetch)
donde llamarían
get_random_users(100)
Para las personas que vienen a la respuesta, ahora debería utilizar el nueva función de agregación $sample
, nueva en 3.2.
https://docs.mongodb.org/manual/reference/operator/aggregation/sample/
db.collection_of_things.aggregate(
[ { $sample: { size: 15 } } ]
)
A continuación, agregue un paso más para contar hasta los 0
s y 1
s utilizando $group
para obtener el recuento. Here is an example from the MongoDB docs.
- 1. Seleccione muestreo aleatorio de sqlserver rápidamente
- 2. ¿Algoritmo eficiente para el muestreo aleatorio de una distribución al tiempo que permite actualizaciones?
- 3. Muestreo de yacimientos
- 4. Muestreo en visual vm
- 5. muestreo rápido en R
- 6. Algoritmo de muestreo sin reemplazo?
- 7. mongo - rubí mongo problema de conexión
- 8. Aleatorio no es aleatorio
- 9. Muestreo de archivos de datos grandes
- 10. Encuentro aleatorio no tan aleatorio
- 11. secuencias de muestreo de números aleatorios en Haskell
- 12. PHP Mongo: Aviso: Mongo :: __ construct(): servidores de análisis sintáctico
- 13. Ordenar un conjunto de resultados aleatoriamente en mongo
- 14. ¿Por qué no es aleatorio() aleatorio?
- 15. reutilización de números aleatorios en el muestreo depósito
- 16. quitar _id de mongo resultado
- 17. Redis, Mongo o Hazelcast?
- 18. mongo usando la subcolección
- 19. Flask y Mongo
- 20. Ruby Mongo Driver - Find_by_Id
- 21. Generador de texto aleatorio
- 22. Retardo de tiempo aleatorio
- 23. Diseño de mosaico aleatorio
- 24. Mongo Db y Spring
- 25. Mongo clasificación compleja?
- 26. iOS: Unidades de audio: configuración de frecuencia de muestreo arbitraria
- 27. La frecuencia de muestreo de audio depende de los canales?
- 28. Frecuencia de muestreo para la grabación de audio del iPhone
- 29. Trazado de dos funciones con diferente frecuencia de muestreo
- 30. FFT/IFFT: Frecuencia de muestreo y duración de la señal
¿Podría aceptar una respuesta? –
posible duplicado de [Registro aleatorio de MongoDB] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) –
Hola Aditya, ¿puedes aceptar una respuesta? – dalanmiller