Ho una collezione mongo con documenti. C'è un campo in ogni documento che è 0 O 1. Ho bisogno di campionare casualmente 1000 record dal database e contare il numero di documenti che hanno quel campo come 1. Ho bisogno di fare questo campionamento 1000 volte. Come lo faccio ?Campionamento casuale da Mongo
risposta
Ecco un esempio nel mongo
shell .. ipotizzando una raccolta di collname
, e un valore di interesse 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);
}
}
Questo risponde anche a un'altra domanda: che a differenza di SQL, MongoDB non ha una funzione incorporata per questo realmente.Anche questo salto potrebbe (... potrebbe) diventare fastidioso per valori casuali più grandi, dipende però. – Sammaye
stavo andando modificare il mio commento su @Stennies rispondo con questo, ma si potrebbe anche utilizzare un indice ID incrementale automatico seprate qui come alternativa se si dovessero saltare enormi quantità di record (parlando enorme qui).
ho scritto un'altra risposta ad un'altra domanda molto come questo in cui qualcuno stava cercando di trovare ennesimo record della collezione:
php mongodb find nth entry in collection
La seconda metà della mia risposta fondamentalmente descrive un metodo potenziale che potresti affrontare questo problema. Dovresti comunque ripetere il ciclo 1000 volte per ottenere la riga casuale, naturalmente.
Per MongoDB 3.0 e versioni precedenti, utilizzo un vecchio trucco dei giorni SQL (che credo utilizzi Wikipedia per la loro funzione di pagina casuale). Memorizzo un numero casuale compreso tra 0 e 1 in ogni oggetto che ho bisogno di randomizzare, chiamiamolo quel campo "r". Quindi aggiungi un indice su "r".
db.coll.ensureIndex(r: 1);
Ora per ottenere oggetti x casuali, si utilizza:
var startVal = Math.random();
db.coll.find({r: {$gt: startVal}}).sort({r: 1}).limit(x);
Questo vi dà oggetti casuali in una singola query di ricerca. A seconda delle tue esigenze, questo potrebbe essere eccessivo, ma se stai andando a fare molti campionamenti nel tempo, questo è un modo molto efficiente senza caricare il tuo back-end.
Ottimo! Molto intelligente! –
soluzione elegante! –
Se si utilizza il mongoengine, è possibile utilizzare un campo Sequence per generare un contatore incrementale.
class User(db.DynamicDocument):
counter = db.SequenceField(collection_name="user.counters")
Poi per andare a prendere un elenco casuale di dire al 100, effettuare le seguenti operazioni
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)
dove si sarebbe chiamata
get_random_users(100)
Per chi arriva alla risposta, si dovrebbe ora utilizzare il nuova funzione di aggregazione $sample
, nuova in 3.2.
https://docs.mongodb.org/manual/reference/operator/aggregation/sample/
db.collection_of_things.aggregate(
[ { $sample: { size: 15 } } ]
)
quindi aggiungere un altro passo per contare i 0
s e 1
s utilizzando $group
per ottenere il conteggio. Here is an example from the MongoDB docs.
- 1. Seleziona campionamento casuale da sqlserver rapidamente
- 2. ponderato campionamento casuale in elasticsearch
- 3. campionamento casuale basato su gruppi
- 4. campionamento casuale di sottostringhe non sovrapposti di lunghezza k
- 5. Campionamento casuale da un set di dati, preservando la distribuzione di probabilità originale
- 6. Casuale diverso da quello casuale
- 7. Campionamento serbatoio
- 8. Ordinare un set di risultati in modo casuale in mongo
- 9. dplyr: Integer campionamento entro mutare
- 10. Convalidare JSON da Mongo?
- 11. Campionamento statistico SQL
- 12. campionamento sul fattore R
- 13. rimuovere _ID da Mongo risultato
- 14. Mongo - Ignora proprietà da persistere
- 15. Campionamento stratificato in Spark
- 16. Campionamento dati SQL
- 17. python: campionamento senza sostituzione da una griglia 2D
- 18. Come convertire la frequenza di campionamento da AV_SAMPLE_FMT_FLTP a AV_SAMPLE_FMT_S16?
- 19. Campionamento da una distribuzione gamma inversa in R
- 20. Valore casuale da flag enum
- 21. Numero casuale da un seme
- 22. Documento casuale in ElasticSearch
- 23. Panda: campionamento di un DataFrame
- 24. Frequenza di campionamento API WebAudio
- 25. Rimuovi elemento null da mongo array
- 26. ottenere il valore MongoBinData da mongo shell
- 27. Leggere un file da una shell mongo
- 28. ObjectID Mongo: sicuro da usare in natura?
- 29. Ottieni UUID BinData da Mongo come stringa
- 30. ElasticSearch & Mongo
Potresti accettare una risposta? –
possibile duplicato di [Record casuale da MongoDB] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) –
Hey Aditya, puoi accettare una risposta? – dalanmiller