Spring-MongoDB geonear无法与额外字段一起使用

3
我有一些地理空间数据存储在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返回适当的结果(但不使用空间信息)。如果我使用存储库,可以获得地点列表,但不会考虑其他参数。
提前感谢。
2个回答

2
我找到了一种方法可以自己完成。我一直在调试代码,直到进入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. 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没有结果的原因是由于NearQuery类的.query(...)部分执行了这个操作:
public NearQuery query(Query query) {
    this.query = query;
    this.skip = query.getSkip();
    this.num = query.getLimit();
    return this;
}

NearQuery的参数num会被Querylimit覆盖。 .num(...).query(...)的顺序非常重要。 您需要在.query(...)之后添加.num(20),如(4),或使用query.limit(20),如(5)。 如果两者都结合使用,则以最后一个值为准(6)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接