2013-05-31 8 views
7

Ich bin neu zu Mongo, und ich versuche, das erste Dokument aus einer find() Abfrage abzurufen:MongoDB: Suchen das erste Dokument in einer Sammlung

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

Dies ist ein wenig seltsam, da eine Sammlung sieht viel wie ein Array aus. Ich bin mir bewusst, ein einzelnes Dokument mit findOne() abrufen, aber ist es möglich, eins aus einer Sammlung zu ziehen?

+1

try 'findOne()' – Tilo

+1

find gibt einen Cursor zurück, kein Dokument. Sie können .toArray() zu find() hinzufügen, um es in ein Array umzuwandeln, aber für ein Dokument sollten Sie findOne verwenden, wie andere gesagt haben. –

+0

@Asya - Danke für die Erwähnung 'toArray()'.Das ist eine Möglichkeit, um das zu erreichen, was ich in meinem Beispielcode tun wollte, auch wenn es nicht die beste Vorgehensweise ist: - \. – dhulihan

Antwort

11

Die Methode find gibt einen Cursor zurück. Dies funktioniert wie ein Iterator in der Ergebnismenge. Wenn Sie zu viele Ergebnisse haben und versuchen, sie alle auf dem Bildschirm anzuzeigen, zeigt die Shell nur die ersten 20 an und der Cursor zeigt nun auf das 20. Ergebnis der Ergebnismenge. Wenn Sie it eingeben, werden die nächsten 20 Ergebnisse angezeigt und so weiter.

In Ihrem Beispiel denke ich, dass Sie von uns eine Zeile in der Shell versteckt haben.

Dieser Befehl

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

wird nur das Ergebnis an die collection Variablen zuweisen und wird nichts auf dem Bildschirm drucken. Also, das lässt mich glauben, dass du auch gelaufen bist:

> collection 

Nun, was passiert wirklich. Wenn Sie tatsächlich den obigen Befehl verwendet haben, um den Inhalt der collection anzuzeigen, dann hat der Cursor das Ende der Ergebnismenge erreicht (da Sie nur ein Dokument in Ihrer Sammlung haben) und es wird automatisch geschlossen. Deshalb bekommst du den Fehler zurück.

Es ist nichts falsch mit Ihrer Syntax. Sie können es jederzeit verwenden. Stellen Sie nur sicher, dass der Cursor noch geöffnet ist und Ergebnisse enthält. Sie können hierfür die Methode collection.hasNext() verwenden.

+0

Vielen Dank für diese informative Antwort! – dhulihan

0

So können Sie mehrere Optionen haben.

Verwenden Sie Java als Sprache, aber eine Option besteht darin, einen DB-Cursor abzurufen und über die zurückgegebenen Elemente zu iterieren. Oder einfach nur den ersten greifen und rennen.

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; 

Wenn Sie sich für ein bestimmtes Objekt innerhalb des Dokuments suchen, können Sie eine Abfrage schreiben und alle Dokumente danach suchen. Sie können die findOne-Methode verwenden oder einfach eine Liste von Objekten suchen und abrufen, die Ihrer Abfrage entsprechen. Siehe unten:

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

Ist das die Mongo-Shell? Welche Version? Wenn ich die Befehle versuchen Sie schreiben, ich bekomme keine zusätzliche Ausgabe:

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

Im Mongo Shell, find() einen Cursor zurückgibt, kein Array. In den Dokumenten können Sie die methods you can call on a cursor sehen.

findOne() gibt ein einzelnes Dokument zurück und sollte für das funktionieren, was Sie erreichen möchten.

+0

Mein Beispiel Code wurde mit der interaktiven Shell auf [mongodb.org] (http://www.mongodb.org/) – dhulihan

Verwandte Themen