java - MongoDB-Java:如何使 $geoNear 首先进行查询,然后进行距离?

标签 java mongodb mongodb-java

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

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

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

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

有办法颠倒顺序吗?
MongoDB v2.6.5
Java驱动程序v2.10.1

谢谢。


我的 Collection 中的示例文档:

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

最佳答案

您可以在管道顶部添加一个 $match 阶段,以过滤 $geonear 阶段之前的文档。

BasicDBObject match = new BasicDBObject("timestamp", 
                                        new BasicDBObject("$lt", SOMETIME));
AggregationOutput output = col.aggregate(match,geoNear, sort, limit);

下面的代码现在不是必需的,

geoNearFields.put("query", query);

关于java - MongoDB-Java:如何使 $geoNear 首先进行查询,然后进行距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670959/

相关文章:

java - 使用文件更新 JList

java - 我不明白为什么 Hibernate 创建一个带有两个连接的查询

mongodb - 将遗留 EAV 模式转换为 Mongo 或 Couch

java - 在 java 中为 mongodb 创建地理空间查询

java - 合并两个集合并在 MongoDB 中生成文件

java - 在 Mongo 3.3.0 中使用 QueryBuilder 查询 Mongo 集合

JavaFX TableView 单击标题

java - 出现 org.springframework.web.servlet.PageNotFound 错误handleHttpRequestMethodNotSupported

javascript - 当数据库中有\n 时,在浏览器中显示新行 <br>

java - Mongodb:在 Java(和 JavaScript)中调用 db.printShardingStatus()/sh.status()