我在MongoDB中有一些地理空间数据,我希望找到接近用户位置并符合某些标准的位置列表。
这是我的文档结构:
{ "_id" : { "$oid" : "528af043d1a2760efcd2fd2f" }, "city" : "Miami", "name" : "Some Place", "tickets" : 61, "zipcode" : "33142", "type" : "amusement park", "state" : "FL", "location" : [ -80.24, 25.8092 ]}
{ "_id" : { "$oid" : "528af043d1a2760efcd2fd30" }, "city" : "Miami", "name" : "Other place", "tickets" : 15, "zipcode" : "33150", "type" : "theatre", "state" : "FL", "location" : [ -80.2094, 25.8587 ]}现在我正试图通过经纬度找到一些地方,那里有票可买,而且是某种类型的。当我只使用带有坐标的NearQuery (不添加查询)时,我得到的是结果,但是当我添加查询对象时,我得到的是空列表。
这是我的代码:
public GeoResults<Place> find(double lat, double lon, int tickets, String type) {
Point point = new Point(lon, lat);
Query query = new Query(Criteria.where("tickets").gt(tickets).
and("type").is(type));
NearQuery nearQuery = NearQuery.near(point).maxDistance(new Distance(10, Metrics.KILOMETERS));
nearQuery.query(query);
GeoResults<Place> repoData = repo.findByLocationNear(point, new Distance(10, Metrics.KILOMETERS));
GeoResults<Place> data = mongoTemplate.geoNear(nearQuery, Place.class);
List<Place> testData = mongoTemplate.find(query, Place.class);
return data;
}从上述代码中,GeoResults数据没有内容,而List testData返回正确的结果(但不使用空间信息)。如果我使用存储库,我可以获得位置列表,但这不考虑其他参数。
提前谢谢
发布于 2013-11-20 09:34:53
我自己找到了一种方法。我在库中调试了所有代码,并看到“num”设置为0,“field”设置为空。因此,在调试期间,我手动添加了字段,并为它应该检索的文档数量提供了一个值。我的假设是,它应该返回符合标准的所有字段和任意数量的文件。
下面是创建查询的更新代码:
Query query = new Query(Criteria.where("tickets").gt(tickets).
and("type").is(type));
query.fields().include("city").include("name").include("tickets").
include("type").include("state").include("address");
NearQuery nearQuery = NearQuery.near(point).maxDistance(new Distance(radius, Metrics.KILOMETERS));
nearQuery.query(query);
nearQuery.num(100);
GeoResults<Place> data = mongoTemplate.geoNear(nearQuery, Place.class); 发布于 2013-12-18 11:16:16
我也遇到了同样的问题,经过长时间的斗争,我终于找到了问题的根源。
1. NearQuery.near(point).maxDistance(distance); //returns all possible results
2. NearQuery.near(point).maxDistance(distance).num(20); //returns 20 nearest results
3. NearQuery.near(point).maxDistance(distance).num(20).query(new Query()); //returns 0!! results
4. NearQuery.near(point).maxDistance(distance).query(new Query()).num(20); //returns 20 nearest results
5. NearQuery.near(point).maxDistance(distance).query(new Query().limit(20)); //returns 20 nearest results
6. NearQuery.near(point).maxDistance(distance).query(new Query().limit(20)).num(5); //returns 5!! nearest results第三个NearQuery的结果为0的原因是,NearQuery类的.query(...)部分执行以下操作:
public NearQuery query(Query query) {
this.query = query;
this.skip = query.getSkip();
this.num = query.getLimit();
return this;
}参数num of NearQuery被Query的limit重写。.num(...)和.query(...)的顺序非常重要。您必须在.num(20) (4)之后添加 .query(...) (4),或者使用query.limit(20) like (5)。如果将两者结合起来,最后一个值将获胜(6)。
https://stackoverflow.com/questions/20073478
复制相似问题