我的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
必须仅排序。
答案 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());