Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDBJava:如何让$geoNear先做查询,然后做距离?_Java_Mongodb_Mongodb Java - Fatal编程技术网

MongoDBJava:如何让$geoNear先做查询,然后做距离?

MongoDBJava:如何让$geoNear先做查询,然后做距离?,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我尝试按如下方式查询和排序文档: 仅查询早于某个时间的文档。 在半径范围内,以弧度为单位。 获取每个文档的距离。 按时间分类。从新到旧。 总的来说,它应该返回多达20个结果。 但似乎由于$geoNear在默认情况下被限制为100个结果,所以我得到了意想不到的结果。 我看到$geoNear按以下顺序工作: 按距离从整个集合中获取文档。 然后才执行给定的查询。 有没有办法颠倒顺序? MongoDB v2.6.5 Java驱动程序v2.10.1 非常感谢。 我的收藏中的示例文档: { "tim

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

仅查询早于某个时间的文档。 在半径范围内,以弧度为单位。 获取每个文档的距离。 按时间分类。从新到旧。 总的来说,它应该返回多达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阶段之前过滤文档

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

geoNearFields.put("query", query);

是否比这样做更好:geoNearFields.putnum,db.getCollectionCOL_NAME.getCountBasicDBObjectquery.copy?对$match阶段在$geoNear阶段开始之前过滤掉我们不想要的记录。它总是比将$geoNear阶段应用于所有文档,然后只返回相关文档要好,。。使用“限制”选项时不需要。抱歉,该选项不起作用。我从mongo得到一个异常:exception:$geoNear仅允许作为第一个管道阶段HMM。。是的$geoNear应该是管道的第一阶段。完全没有抓住那一点。是否包含-geoNearFields.putnum,20,为您提供了正确的结果?否,num必须是整个集合的大小。这就是为什么代码有一个注释掉的num=5000。num键标记要返回的最大文档数,它的作用与limit阶段完全相同。是的,但是$geoNear limit/num在查询之前执行。查询是在一小组文档上完成的,而不是在整个集合上完成的。
geoNearFields.put("query", query);