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