首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-MongoDB geonear不使用额外字段

Spring-MongoDB geonear不使用额外字段
EN

Stack Overflow用户
提问于 2013-11-19 13:57:21
回答 2查看 2.9K关注 0票数 3

我在MongoDB中有一些地理空间数据,我希望找到接近用户位置并符合某些标准的位置列表。

这是我的文档结构:

代码语言:javascript
复制
{ "_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 (不添加查询)时,我得到的是结果,但是当我添加查询对象时,我得到的是空列表。

这是我的代码:

代码语言:javascript
复制
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返回正确的结果(但不使用空间信息)。如果我使用存储库,我可以获得位置列表,但这不考虑其他参数。

提前谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-20 09:34:53

我自己找到了一种方法。我在库中调试了所有代码,并看到“num”设置为0,“field”设置为空。因此,在调试期间,我手动添加了字段,并为它应该检索的文档数量提供了一个值。我的假设是,它应该返回符合标准的所有字段和任意数量的文件。

下面是创建查询的更新代码:

代码语言:javascript
复制
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); 
票数 2
EN

Stack Overflow用户

发布于 2013-12-18 11:16:16

我也遇到了同样的问题,经过长时间的斗争,我终于找到了问题的根源。

代码语言:javascript
复制
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(...)部分执行以下操作:

代码语言:javascript
复制
public NearQuery query(Query query) {
    this.query = query;
    this.skip = query.getSkip();
    this.num = query.getLimit();
    return this;
}

参数num of NearQueryQuerylimit重写。.num(...).query(...)的顺序非常重要。您必须在.num(20) (4)之后添加 .query(...) (4),或者使用query.limit(20) like (5)。如果将两者结合起来,最后一个值将获胜(6)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20073478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档