2011-11-09 10 views
7

Ho bisogno di scegliere un documento da una collezione a caso (in alternativa - un piccolo numero di documenti successivi da una "finestra" posizionata in modo casuale). Ho trovato due soluzioni: 1 e 2. Il primo è inaccettabile poiché prevedo grandi dimensioni di raccolta e desidero ridurre al minimo le dimensioni del documento. Il secondo sembra inefficace (non sono sicuro della complessità dell'operazione skip). E here si può trovare una menzione di interrogare un documento con un indice specificato, ma non so come farlo (sto usando il driver C++).MongoDB: qual è il modo più efficiente per interrogare un singolo documento casuale?

Esistono altre soluzioni al problema? Qual è il più efficiente?

+0

C'è un [richiesta di funzionalità per ottenere elementi casuali da una collezione] (https://jira.mongodb.org/browse/SERVER-533) nella inseguitore biglietto di MongoDB. Se implementato in modo nativo, sarebbe probabilmente l'opzione più efficiente. (Se si desidera la funzione, andare a votare.) –

+1

Questa domanda è stata posta sotto molte forme qui su Stack Overflow. La domanda più popolare è [Record casuale da MongoDB] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) - ha buone risposte. Detto questo, penso che il modo migliore di pensare alla domanda sia non pensare di ottenere un documento a caso ma, piuttosto, randomizzare un set di risultati. Vedi [Ordinando un set di risultati a caso in Mongo] (http://stackoverflow.com/questions/8500266/ordering-a-result-set-randomly-in-mongo) per quello. –

risposta

2

ho avuto un problema simile una volta. Nel mio caso, avevo una proprietà data sui miei documenti. Conoscevo la prima data possibile nel set di dati, quindi nel mio codice applicativo genererei una data casuale nell'intervallo EARLIEST_DATE_IN_SET e NOW e quindi interrogare mongodb utilizzando una query GTE sulla proprietà date e limitarlo semplicemente a 1 risultato.

c'era una piccola possibilità che la data casuale sarebbe maggiore rispetto alla data più alta del set di dati, così ho rappresentato il che nel codice dell'applicazione.

Con un indice sulla proprietà data, questa era una query super veloce.

+0

Grazie, sono andato con questa opzione.Ho appena profilato la mia domanda, e vorrei che tutti gli accessi di Mongo fossero veloci come scegliere un documento a caso con il tuo metodo :) –

2

Sembra che tu possa modellare la soluzione 1 lì, (supponendo che la tua chiave _id fosse un valore di autoincremento), quindi basta fare un conteggio sui tuoi record e usarlo come limite superiore per un int casuale in C++, poi prendi quella fila.

Allo stesso modo, se non si dispone di una chiave di AutoInc _id, basta creare uno con i risultati .. avere un ulteriore campo con un INT non dovrebbe aggiungere più di tanto per le dimensioni del documento.

Se non si dispone di un campo di auto-inc Mongo parla di come aggiungere rapidamente uno qui:

Auto Inc Field.

+0

Non sono sicuro di avere un _inc autoid o no. Speravo di evitarlo. Il mio documento ha un campo ID e sto facendo 'ensureIndex' per quel campo ogni volta che inserisco un nuovo documento. Sono nuovo di Mongo, quindi non posso davvero dirlo. –

+0

È possibile interrogare un documento non con indice corrispondente, ma con l'indice più vicino a quello che ho specificato? Dovrebbe essere veloce come una normale query per indice, e risolve il mio problema. –

+0

la cosa con gli ID di Mongo è che se stai usando il MongoID predefinito (che genera) usano il modello Object di BSON: http://www.mongodb.org/display/DOCS/Object+IDs. Puoi sovrascriverlo creando la tua serie di _id sulla creazione del documento iniziale, ma devi solo confermare che sono sempre unici. – Petrogad

Problemi correlati