2013-05-31 14 views
7

Sono nuovo di Mongo, e sto cercando di recuperare il primo documento da una query find():MongoDB: Recupero il primo documento in una raccolta

> db.scores.save({a: 99}); 
> var collection = db.scores.find(); 
[ 
    { "a" : 99, "_id" : { "$oid" : "51a91ff3cc93742c1607ce28" } } 
] 
> var document = collection[0]; 
JS Error: result is undefined 

Questo è un po 'strano, dal momento che una collezione sembra molto simile a un array. Sono a conoscenza del recupero di un singolo documento utilizzando findOne(), ma è possibile estrarne uno da una raccolta?

+1

try 'findOne()' – Tilo

+1

find restituisce un cursore non un documento. Puoi aggiungere .toArray() a find() per trasformarlo in un array ma per un documento devi usare findOne come altri hanno detto. –

+0

@Asya - Grazie per aver menzionato 'toArray()'.Questo è un modo per realizzare ciò che volevo fare nel mio codice di esempio, anche se non è la migliore pratica: - \. – dhulihan

risposta

11

Il metodo find restituisce un cursore. Funziona come un iteratore nel set di risultati. Se si hanno troppi risultati e si tenta di visualizzarli tutti sullo schermo, la shell visualizzerà solo i primi 20 e il cursore punterà ora sul 20 ° risultato del set di risultati. Se si digita it, verranno visualizzati i 20 risultati successivi e così via.

Nel tuo esempio, penso che ci hai nascosto una riga nella shell.

Questo comando

> var collection = db.scores.find(); 

sarà solo assegnare il risultato alla collection variabile e non stampa nulla sullo schermo. Quindi, questo mi fa credere che tu abbia anche eseguito:

> collection 

Ora, quello che sta realmente accadendo. Se in effetti hai utilizzato il comando precedente per visualizzare il contenuto di collection, il cursore avrà raggiunto la fine del set di risultati (poiché nella raccolta è presente un solo documento) e verrà chiuso automaticamente. Ecco perché si ottiene l'errore.

Non c'è niente di sbagliato nella sintassi. Puoi usarlo quando vuoi. Assicurati che il tuo cursore sia ancora aperto e abbia risultati. È possibile utilizzare il metodo collection.hasNext() per quello.

+0

Grazie per questa risposta informativa! – dhulihan

0

Quindi è possibile avere diverse opzioni.

Utilizzo di Java come lingua, ma un'opzione è ottenere un cursore db e scorrere gli elementi restituiti. O semplicemente semplicemente prendi il primo e corri.

DBCursor cursor = db.getCollection(COLLECTION_NAME).find(); 
List<DOCUMENT_TYPE> retVal = new ArrayList<DOCUMENT_TYPE>(cursor.count()); 
while (cursor.hasNext()) { 
    retVal.add(cursor.next()); 
} 
return retVal; 

Se siete alla ricerca di un particolare oggetto all'interno del documento, è possibile scrivere una query e ricercare tutti i documenti per esso. È possibile utilizzare il metodo findOne o semplicemente trovare e ottenere un elenco di oggetti corrispondenti alla query. Vedi sotto:

DBObject query = new BasicDBObject(); 
query.put(SOME_ID, ID); 
DBObject result = db.getCollection(COLLECTION_NAME).findOne(query) // for a single object 
DBCursor cursor = db.getCollection(COLLECTION_NAME).find(query) // for a cursor of multiple objects 
0

Quello è il guscio di Mongo? Quale versione? Quando provo i comandi digitati, non ottengo alcun output extra:

MongoDB shell version: 2.4.3 
connecting to: test 
> db.scores.save({a: 99}); 
> var collection = db.scores.find(); 
> var document = collection[0]; 

Nella shell Mongo, find() restituisce un cursore, non un array. Nei documenti puoi vedere lo methods you can call on a cursor.

findOne() restituisce un singolo documento e dovrebbe funzionare per quello che stai cercando di realizzare.

+0

Il mio codice di esempio è stato eseguito utilizzando la shell interattiva su [mongodb.org] (http://www.mongodb.org/) – dhulihan

Problemi correlati