2016-10-23 1 views
0

Ich habe eine DBList, die DBObjects von einer cursor = coll.find() Abfrage enthält. Ich habe ein Feld mit dem Namen timestamp innerhalb jeder DBObject und ich möchte die DBList von neuesten Zeitstempel sortieren. Ich weiß, dass ich Collections.sort() hier verwenden kann, aber neu in mongoDBs Java-API zu sein, kann ich nicht in der Lage sein, basierend auf einem bestimmten Feld zu sortieren. Ich würde die Hilfe wirklich schätzen.Sortieren von DBList mit Collections.sort

Die unsorted list wurde mit dieser gebildet:

 DBCursor cursor = coll.find(whereQuery);     

     while(cursor.hasNext()) { 
      DBObject o = cursor.next(); 
      System.out.println(o.toString()); 
      unsortedList.add(o); 

     } 

Danach möchte ich unsortedList in absteigender Reihenfolge von timestamp sortieren. Ich weiß nicht genau, wie ich das machen soll und bedanke mich im Voraus für die Hilfe.

Auch Lösungen wie coll.find().sort(timestamp,-1) können nicht verwendet werden, da es eine äußere for Schleife gibt, die die whereQuery ständig ändert. Die list muss nur nach sortiert werden die Abfrage ist abgeschlossen.

Antwort

0

Das Problem ist, dass wie ändern Sie Ihre Abfrage. Können Sie mir den Code zeigen, den Sie Ihre Abfrage in der for-Schleife ändern, ich denke, dass ich eine bessere Abfrage für Sie bereitstellen kann. MongoDB kann sehr komplizierte Abfragen unterstützen.

Strill, ich denke, ein besserer Weg ist es, mongoDB für Sie zu sortieren. Sie schreiben können wie:

coll.find(whereQueryModified).sort(new BasicDBObject("timestamp",-1)); 

Wenn Sie die Sortiermethode verwenden können, müssen Sie möglicherweise eine neuere Version von mongoDB-Treiber verwenden.

Außerdem ist "Zeitstempel" zu lang für einen Schlüssel eines Objekts. Es ist sehr platzraubend für mongoDB, da mongoDB jeden Schlüssel und Wert auf der Festplatte speichert.

0

Sie können die Abfrage wie folgende Strategie ändern:

List<DBObject> pipeline=new ArrayList<DBObject>(); 
DBObject match = new BasicDBObject("$match", new BasicDBObject("date", sdf.format(new Date())).append("country", country)); 
DBObject unwind = new BasicDBObject("$unwind", "$details"); 
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("details.datetime", -1)); 
DBObject limit = new BasicDBObject("$limit", 1); 

pipeline.add(match); 
pipeline.add(unwind); 
pipeline.add(sort); 
pipeline.add(limit); 

AggregationOutput outputoutput = collection.aggregate(pipeline); 
0

Wenn DBList Geräte List:

Collections.sort(unsortedList, Comparator.comparing(DBObject::getTimestamp).reversed());

Verwandte Themen