Durchlaufen Dokumente in MongoDB
Möchte ich in einer Schleife durch Dokumente in MongoDB. Grundsätzlich ist hier die situation. Ich habe einige JTextfields, die ich Auffüllen möchten von MongoDB. Also jedes mal, wenn der Benutzer auf die Schaltfläche Weiter klicken, wird ein neuer Datensatz heruntergeladen werden müssen und zeigen Sie es in das JTextField. Hier ist mein code:
public class nextstud implements ActionListener
{
public void actionPerformed(ActionEvent e) {
try {
Mongo s = new Mongo();
DB db = s.getDB( "omrs1" );
DBCollection coll = db.getCollection("Student") ;
DBCursor curs = coll.find();
if(curs.hasNext()) {
DBObject o = curs.next();
String fname = (String) o.get("Firstname") ;
String lname = (String) o.get("Lastname") ;
String sid = (String) o.get("StudentID") ;
String prg = (String) o.get("Programme") ;
String lvl = (String) o.get("Level") ;
txtfname.setText(fname) ;
}
btndelstud.setEnabled(true);
btnbkstud.setEnabled(true) ;
btnfwdstud.setEnabled(true);
} catch (UnknownHostException x) {
x.printStackTrace();
} catch (MongoException x) {
x.printStackTrace();
}
}
} //end class
Aber es funktioniert nicht. Es zeigt nur den ersten Datensatz jedes mal, wenn ich drücken Sie die Schaltfläche weiter. Wenn ich
if(curs.hasNext()) {
zu
while(curs.hasNext()) {
Er zeigt nur den letzten Datensatz. Bitte helfen?
- stellen Sie bitte Ihre Klassennamen beginnen mit einem Großbuchstaben
- Werde ich im Hinterkopf behalten. Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Kevin erwähnt, das problem ist, dass Sie Holen ein neues cursor auf jede Taste drücken, es ist also immer von vorne beginnen. Es gibt zwei mögliche Ansätze, die dieses problem beheben.
Holen Sie den cursor einmal, und bewegen sich durch Sie als nächsten geschoben wird. Um dies zu tun, stellen Sie den cursor ein Feld, und Holen Sie den cursor in den Hörer Konstruktor.
Die nächste alternative ist, zu halten, zu zählen, wie viele items abgerufen wurden, und aktualisieren Sie die cursor-skip-count:
Dem ersten Ansatz, ist wahrscheinlich etwas schneller. Mongo tun können, diese iteration mit einem einzigen Baum-traversal (im Gegensatz zu vielen für den zweiten Ansatz).
Dem zweiten Ansatz nicht halten Sie einen cursor öffnen, zwischen-button klickt. Diese Art der Sache ist wichtig für die Skalierbarkeit für web-Anwendungen zwischen den Abfragen, aber möglicherweise keine Rolle, wie viel mit einer gui app (vor allem, wenn die Anzahl der gleichzeitigen Nutzer ist kleiner).
Weiteren großen Vorteil des zweiten Ansatzes ist, dass man rückwärts gehen kann —
DBCursor
nichtprevious()
- Methode, so müssen Sie diese Methode verwenden, wenn Sie immer fügen Sie eine Schaltfläche.Einige andere Dinge, die Sie sollten wahrscheinlich tun:
Fügen Sie eine Schicht der Dereferenzierung, so dass Sie Ihre GUI-event-handling-code und Ihre MongoDB data access-code nicht ganz so stark gekoppelt. So sparen Sie einen Haufen ärger, wenn Sie verschieben in eine andere Datenbank (vielleicht eher unwahrscheinlich), oder fügen Sie eine Schaltfläche integriert, mit der gleichen Abfrage (vielleicht eher).
Erinnern, schließen Sie den cursor wenn Sie fertig sind mit ihm.
DBCursor
Implementierungen Leck, und müssen gereinigt werden, mit einem timeout-Schema, wenn Sie nicht explizit, Sie zu schließen. Dies gilt insbesondere, wenn Sie nicht komplett Durchlaufen werden, um die gesamte Ergebnismenge. Dies gilt auch für die Mongo-Instanz als gut, aber Sie brauchen nur einen einzigen von denen für die gesamte Anwendung.Das problem ist, dass Sie Holen ein neues cursor jedes mal. So zeigt es nur den ersten Datensatz. Ich nehme an, Sie haben mehr als ein text-Feld, wenn Sie wollen die ganze Initialisierung in einer Funktion müssen Sie betreiben, auf eine Reihe von Textfeldern, nicht ein einziger. Oder, wenn die Absicht ist zu nennen actionPerformed mehrfach (einmal für jedes textField), dann sollten Sie pflegen einige Zustand (z.B. der Mauszeiger) zwischen aufrufen von actionPerformed. Ich mache nicht viel GUI-Programmierung aber so ich bin mir nicht sicher, was richtig ist, basierend auf dem code-snippet Sie bereitgestellt haben.