MongoDB-Java:如何使$geoNear先做查询,然后做距离



>我正在尝试按如下方式查询和排序文档:

  • 仅查询早于 SOMETIME 的文档。
  • 在AROUNDME_RANGE_RADIUS_IN_RADIANS范围内。
  • 获取每个文档的距离。
  • 按时间对它们进行排序。从新到旧。
  • 总体而言,它最多应返回 20 个结果。

但似乎由于$geoNear默认限制为 100 个结果,我得到了意想不到的结果。
我看到$geoNear按以下顺序工作:

  1. 按距离从整个集合中获取文档。
  2. 然后才执行给定的查询。

有没有办法颠倒顺序?
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);

最新更新