我在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返回正确的结果(但不使用空间信息)。如果我使用存储库,我可以获取地点列表,但不考虑其他参数。
先谢谢
答案 0 :(得分:1)
我找到了一种自己做的方法。我一直调试代码到Spring-mongodb库,看到'num'设置为0,'fields'设置为null。因此,在调试过程中,我手动添加了字段,并为应检索的文档数量提供了值。我的假设是它应该返回所有字段和符合条件的任意数量的文档。
以下是创建查询的更新代码:
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);
答案 1 :(得分:1)
我遇到了同样的问题,经过长时间的斗争,我终于找到了问题的根本原因。
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结果的原因是由于.query(...)
类的NearQuery
部分执行此操作:
public NearQuery query(Query query) {
this.query = query;
this.skip = query.getSkip();
this.num = query.getLimit();
return this;
}
num
的参数NearQuery
被limit
的{{1}}覆盖。
Query
和.num(...)
的顺序非常重要。
您必须在 .query(...)
之后添加.num(20)
(4)或使用.query(...)
之类的({5)。
如果将两者结合使用,则最后一个值为wins(6)。