使用Collections.sort对DBList进行排序

时间:2016-10-23 22:23:20

标签: java mongodb sorting collections

我的DBList包含来自DBObjects查询的cursor = coll.find()。我在每个timestamp中都有一个名为DBObject的字段,我希望按最新时间戳DBList进行排序。我知道我可以在这里使用Collections.sort()但是对mongoDB的java API不熟悉,我似乎无法根据特定字段进行排序。我真的很感激帮助。

unsorted list是使用以下形式形成的:

      DBCursor cursor = coll.find(whereQuery);                  

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

      }

在此之后,我想按unsortedList的降序排序timestamp。我不清楚如何做到这一点,并提前感谢你的帮助。

此外,无法使用coll.find().sort(timestamp,-1)等解决方案,因为外部for循环会不断更改whereQuery。在查询完成后,list必须仅排序

3 个答案:

答案 0 :(得分:0)

问题是你如何改变你的查询。你能告诉我你在for循环中更改查询的代码,我想我可以为你提供更好的查询。 MongoDB可以支持非常复杂的查询。

Strill,我认为更好的方法是让mongoDB为你排序。 你可以这样写:

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

如果您不能使用sort方法,则可能需要使用较新版本的mongoDB驱动程序。

此外,"时间戳"是为了一个对象的关键。因为mongoDB存储了磁盘中的每个键和值,所以mongoDB的空间非常耗费。

答案 1 :(得分:0)

您可以按以下策略更改查询:

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);

答案 2 :(得分:0)

如果DBList实施List

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