>我正在尝试按如下方式查询和排序文档:
- 仅查询早于 SOMETIME 的文档。
- 在AROUNDME_RANGE_RADIUS_IN_RADIANS范围内。
- 获取每个文档的距离。
- 按时间对它们进行排序。从新到旧。
- 总体而言,它最多应返回 20 个结果。
但似乎由于$geoNear默认限制为 100 个结果,我得到了意想不到的结果。
我看到$geoNear按以下顺序工作:
- 按距离从整个集合中获取文档。
- 然后才执行给定的查询。
有没有办法颠倒顺序?
MongoDB v2.6.5
Java 驱动程序 v2.10.1
谢谢。
我收藏的示例文档:
{
"timestamp" : ISODate("2014-12-27T06:52:17.949Z"),
"text" : "hello",
"loc" : [
34.76701564815013,
32.05852053407342
]
}
我正在使用聚合,因为据我了解,这是按"时间戳"排序并获取距离的唯一方法。
BasicDBObject query = new BasicDBObject("timestamp", new BasicDBObject("$lt", SOMETIME));
// aggregate: geoNear
double[] currentLoc = new double[] {
Double.parseDouble(myLon),
Double.parseDouble(myLat)
};
DBObject geoNearFields = new BasicDBObject();
geoNearFields.put("near", currentLoc);
geoNearFields.put("distanceField", "dis");
geoNearFields.put("maxDistance", AROUNDME_RANGE_RADIUS_IN_RADIANS));
geoNearFields.put("query", query);
//geoNearFields.put("num", 5000); // FIXME: a temp solution I would really like to avoid
DBObject geoNear = new BasicDBObject("$geoNear", geoNearFields);
// aggregate: sort by timestamp
DBObject sortFields = new BasicDBObject("timestamp", -1);
DBObject sort = new BasicDBObject("$sort", sortFields);
// aggregate: limit
DBObject limit = new BasicDBObject("$limit", 20);
AggregationOutput output = col.aggregate(geoNear, sort, limit);
您可以在 pipleine 的顶部添加一个$match
阶段,以便在$geonear
阶段之前过滤文档。
BasicDBObject match = new BasicDBObject("timestamp",
new BasicDBObject("$lt", SOMETIME));
AggregationOutput output = col.aggregate(match,geoNear, sort, limit);
下面的代码段现在,不是必需的,
geoNearFields.put("query", query);