2016-01-07 13 views
7

così ho creato un oggetto Cursor avendoPosso ottenere solo il primo oggetto in un oggetto Cursore (pymongo)?

cdb=self.mongo['bleh_bleh_bleh_setup_here'] 
data=cdb[collection].find(query_commands_here) 

Non si preoccupi per la sintassi di cui sopra. Supponiamo che io possa creare con successo tale oggetto cursore

So che posso fare un ciclo for per scorrere l'oggetto, ma tutto ciò che voglio è il primo oggetto di questo oggetto. Esiste un modo più efficiente rispetto al ciclo?

EDIT:

per rendere le cose più chiare, il 'bleh_bleh_bleh_setup_here' è semplicemente il percorso per la connessione al MongoDB desiderata, e 'query_commands_here' sono domande come {field1:{'$gt':num1}, field2:{'$ne':num2}} quel genere di cose. La linea

data=cdb[collection].find(query_commands_here) 

mi darà un oggetto Cursor che posso iterare con un ciclo for. Quindi cose come

for item in data: 
    print item 

stamperà ciascuna voce nell'oggetto. Funziona bene. Tuttavia, secondo la documentazione, questo oggetto del cursore dovrebbe avere il metodo chiamato .hasNext(), che dovrebbe restituire True se c'è una voce successiva. Finora, non ho trovato un modo per farlo funzionare per qualche strana ragione. data.next() mi dà una voce però. Voglio assicurarmi di avere quella condizione per assicurarmi di non chiamare .next() per un oggetto cursore che non contiene nulla, anche se non prevedo questo tipo di situazione, ma suppongo che si verificherebbe a un certo punto .

risposta

6

.find_one() restituirebbe un unico documento corrispondenti ai criteri:

cdb[collection].find_one(query_commands_here) 

Si noti che il PyMongo Cursor non dispone di un metodo hasNext(). Quello che vorrei fare è chiamare cursor.next() e gestire l'eccezione StopIteration:

try: 
    record = cursor.next() 
except StopIteration: 
    print("Empty cursor!") 
+0

Grazie! In questo momento voglio conservare tutte le informazioni nell'oggetto Cursor mentre sto recuperando alcune informazioni dalla prima voce (dato che avrei un comando sort nel file '.find'). Sarebbe abbastanza efficiente usare 'cdb [collection] .find()' e un'altra riga con 'cdb [collection] .find_one (query_command_here, sort [('field_to_sort': -1)]'? – JChao

+0

o meglio, tutto voglio un campo di quel risultato 'find_one' Come posso ottenere quello? – JChao

+0

@JChao Penso che potresti semplicemente stare bene con un unico comando' find() 'Puoi chiamare' cursor.next() 'per ottenere prima registra e poi chiama ['cursor.rewind()'] (http://api.mongodb.org/python/current/api/pymongo/cursor.html#pymongo.cursor.Cursor.rewind) per resettare il suo stato. Io personalmente non l'ho provato, per favore testate attentamente e registrate le query inviate al server Grazie – alecxe

Problemi correlati