4

我正在使用 spring-data 与 mongodb 进行通信,我正在寻找一种执行地理查询的方法,该方法将通过数据库中的给定地理点检索附近的配置文件,我对查询的要求是:

1) 距离限制
2) 返回的配置文件数量限制
3) 根据配置文件文档中的时间字段进行额外搜索
4) 从检索到的文档中包含/排除字段的能力

起初我使用mongoTemplate.geoNear方法...

   Query criteria = new Query(Criteria.where("time").gte("some_date")); 
   criteria.fields().exclude("friends");
    NearQuery query = NearQuery.near(point).maxDistance(maxDistance)
            .num(limit).query(criteria);
    GeoResults<Profile> result = mongoTemplate
            .geoNear(query, Profile.class);<br/>

但后来我意识到 mongo 不支持在 geoNear 查询中包含/排除字段。
所以我在考虑Near查询,似乎在 spring-data 中执行这种“复杂”查询的唯一方法是使用@Query注释,有没有办法在那种查询中支持上述要求 2,3 ? 还有其他方法吗?
谢谢

4

1 回答 1

1

你的问题实际上包含了你需要的所有答案。您只需使用 query.addCriteria 将它们放在一起。

1:使用带半径的圆
2. 使用 Query.limit(count)
3. 使用 Query.where("date").gte()
4. 使用字段来投影结果

干得好

    Point point = new Point(6.12343, 3.121211);
    Distance distance = new Distance(100, Metrics.KILOMETERS);
    Circle circle = new Circle(point, distance);
    Integer resultLimit = 20; //Limit to 20 records
    Criteria geoCriteria = Criteria.where("position").withinSphere(circle);
    Criteria timeCriteria = Criteria.where("time").gte(new Date());
    Query query = Query.query(geoCriteria);
    query.addCriteria(timeCriteria);
    query.fields().exclude("friends");
    mongoTemplate.find(query, Profile.class);
于 2016-06-21T13:59:10.280 回答