我正在使用java和mongodb。我在mongodb中存储了多个文档。我只想获取12个时间戳小于提供给查询的时间戳的文档。
条件是查询必须选择12个时间戳更接近给定时间戳的文档。
这就是我所做的??
BasicDBObject criteria = new BasicDBObject();
BasicDBObject projections = new BasicDBObject();
criteria.put("hostId",ip);
criteria.put("status",0);
projections.put("runtimeMillis",1);
projections.put("cpuUtilization",1);
String json_string="";
DBCursor cur = coll.find(criteria,projections).sort(new BasicDBObject("runtimeMillis",-1)).limit(12);
Object[] row = createOutputRow(new Object[0], outputRowSize);
int index = 0;
String mystring = null;
List list = new ArrayList();
JSONObject result = new JSONObject();
json_string = "[";
while(cur.hasNext() && !isStopped()) {
String json = cur.next().toString();
JSONObject responseObject = new JSONObject(json);
long convert = Long.parseLong(responseObject.getString("runtimeMillis"));
long set_date = convert;
Date dateObj = new Date(set_date);
String date_text = ft.format(dateObj);
int month = 0;
month = Integer.parseInt(new java.text.SimpleDateFormat("MM").format(dateObj));
/json_string +="{x: ("+convert+"),y: "+responseObject.getString("cpuUtilization")+", color: \"red\"},";
}//end of while
这给了我正确的输出,但按降序排列。如果我按升序排列文档,我会得到最旧的文档。
我希望输出按升序排列,并且必须更接近给定的时间戳(时间戳小于给定时间戳的最新文档),并按升序排序。
我怎么得到这个结果??
1条答案
按热度按时间1hdlvixo1#
让我检查一下我是否正确理解你的意图。你在找12个时间戳在给定时间之前的文档?例如,如果您有以下数据集(为了便于理解,我使用了非常简化的时间戳):
你搜索了时间戳10069,你想在时间戳之前找到12个文档,但按升序排列。你想得到文件4,5,6,7,8,9,10,11,12,13,14,15,16?
您当前的代码过于复杂,这就是为什么有评论建议您检查文档的原因。但是,您实际上是部分正确的,您不能按升序排序并获得所需的值。
我一点也不确定你的代码是什么
DBCursor cur = ...
因为,把json和日期之类的东西弄得乱七八糟,有更简单的方法可以做到这一点,但我让你来研究一下。不过,我已经写了一些东西,可以或多或少地满足您的查询需求,并且我已经编写了一个测试来证明这是您想要的:请注意,这个解决方案在您的情况下是可以的,因为您只返回12项。如果结果非常大,这可能不起作用,因为整个列表将在内存中。这就是为什么在数据库中进行排序通常更好的原因。
有另一种方法可以实现这一点,使用聚合框架-这将允许您设置一种用于限制的排序(您需要降序排序以限制到正确的12项),并设置另一种排序以将它们放入所需的顺序。
我的解决方案中需要了解的关键点是:
$lt,以获取早于给定值的时间戳
限制只返回结果的一个子集
collections.sort和comparator,用于在java中对数组进行排序
我还建议您查看聚合文档。