2016-07-25 2 views
1

Ich bin neu in MongoDB. Ich benutze MongoDB mit Java-Treiber-3.2.2. Früher habe ich den folgenden Code benutzt, um das Ergebnis aus der Datenbank zu holen.Bessere Möglichkeit, das Ergebnis aus der MongoDB mit Java-Treiber zu holen

MongoClient mongoClient = new MongoClient("localhost", 27017); 
@SuppressWarnings("deprecation") 
DB deviceBaseDB = mongoClient.getDB("test"); 
DBCollection deviceBaseCollection = deviceBaseDB.getCollection("myFirstCollection"); 

List<String> list = new ArrayList<String>(); 

     DBCursor cursor = deviceBaseCollection.find(queryObject, projection) 
       .sort(sortingCriteriea).limit(10); 

     while (cursor.hasNext()) { 
      list.add(cursor.next().toString()); 
     } 



But in the above code mongoClient.getDB() call is depricated. So I am trying to use New API() from MongoDB like below. 


MongoDatabase database = mongoClient.getDatabase("test"); 
MongoCollection<Document> collection = database.getCollection("myFirstCollection"); 


      // First approach 
      List<Document> listDocs = collection.find().projection(projection) 
       .sort(new BasicDBObject("likes", -1)).into(new ArrayList<Document>()); 

     List<String> strList1 = new ArrayList<String>(); 

     for(Document doc : listDocs) {  
      strList1.add(doc.toJson()); 
     } 
     System.out.println("List of json files strList1:: " + strList1); 


      // Second Approach 

      FindIterable<Document> iterableDocsWithFilter_SortWithProject = collection.find(
       new BasicDBObject("title", "New MongoDB Learning")).projection(projection) 
       .sort(new BasicDBObject("likes", -1)); 
     Iterator<Document> iterator = iterableDocsWithFilter_SortWithProject.iterator(); 

     List<String> strList2 = new ArrayList<String>(); 
     while (iterator.hasNext()) { 
      strList2.add(iterator.next().toJson()); 
    } 


    System.out.println("List of json files strList2:: " + strList2); 


     // Third Approach 

    MongoCursor<Document> mongoCursor = (MongoCursor<Document>) collection.find(
       new BasicDBObject("title", "New MongoDB Learning")).projection(projection) 
       .sort(new BasicDBObject("likes", -1)); 

    List<String> strList3 = new ArrayList<String>(); 
    while(mongoCursor.hasNext()) { 
     strList3.add(mongoCursor.next().toJson()); 
    } 

     System.out.println("List of json files strList3:: " + strList3); 

Meine Abfragen sind unter:

1) Werden neue API (document.toJson()), um die Leistung zu erhöhen, wie alt depricated API vergleichen (mit toString (Dbcursor))? 2) Ich habe 3 Möglichkeiten gefunden, das Ergebnis aus der MongoDB mit der neuen API zu holen, welche ist besser unter allen 3 Ansätzen?

Antwort

1

1) _ Es gibt einen kleinen Unterschied zwischen dem, was toJson und toString tun. Ein ToJson wird eine JSON-Repräsentation des Dokuments zurückgeben, während der ToString die Standard-String-Ausgabe liefert.

Wenn Sie einen benutzerdefinierten ToString implementiert haben, hängt die Leistung von Ihrer Implementierung von toString ab.

Wenn Sie den Standardwert toString verwenden, sollte toJson im Vergleich zu einem toString mehr Zeit benötigen. Sie können dies überprüfen, indem Sie System.currentTimeMillis() für beide verwenden.

2) _ Alle 3 Wege sind für CRUD in der DB gleichberechtigt. Nun, wenn Sie darüber nachdenken, was Sie gegenüber dem anderen bevorzugen, hängt das wirklich von Ihrer Anwendung ab und was Sie tun müssen.

Wenn Sie nur eine schnelle Abfrage mit ein paar gt, lt etc Filter suchen möchten, dann sollten Sie für den ersten Ansatz gehen; Sie listen das gesamte Ergebnis der Abfrage auf und zeigen es an. Simpel und einfach.

Auf der anderen Seite, wenn Sie einige Aufgaben auf die abgerufenen Ergebnisse ausführen möchten, würde ich empfehlen, entweder mit dem zweiten oder dritten Ansatz zu gehen. Bitte beachten Sie, dass zwischen FindIterable und MongoCursor ein leichter Unterschied besteht.

MongoCursor ist ein einfacher Iterator, nichts anderes; Während FindIterable können Sie Abfragen erstellen. Das folgende Zitat kann einen Einblick in FindIterable geben.

In Wirklichkeit ist FindIterable ähnlich den Dbcursor von alten und wie ein Dbcursor seines eine Implementierung der Iterable Schnittstelle. So können Sie ähnlich behandeln für das Schleifen von Abfrageergebnissen. Der Hauptunterschied ist , dass das FindIterable eine höhere Abstraktion als ein DBCursor ist, es ist eine verkettbare Schnittstelle, die Benutzern ermöglicht, Abfragen in einer fließenden Weise durch Ändern von Filtern und Optionen aufzubauen. Auf der höchsten Ebene FindIterable ist eine Implementierung der MongoIterable-Schnittstelle, die die Ergebnisse einer MongoDB-Operation darstellt, sei es eine Abfrage oder ein Befehl. https://groups.google.com/forum/#!msg/mongodb-user/pcVX84PPwM0/FJ1EjPkAAz0J

Also, wenn Sie nur einmal durch die Abfrageergebnisse gehen und vielleicht eine einfache Aufgabe auf jeden sie führen Sie zu MongoCursor zurückgreifen können.

Ich bleibe persönlich bei FindIterable, weil (einfache Faustregel) bietet es alles, was die anderen Methoden plus mehr tun.

Verwandte Themen