Spring-data MongoDB地理查询

Posted

技术标签:

【中文标题】Spring-data MongoDB地理查询【英文标题】:Spring-data mongodb geo query 【发布时间】:2012-09-22 20:27:09 【问题描述】:

我正在使用 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 的方法?还有其他方法吗? 谢谢

【问题讨论】:

你找到解决办法了吗? Assaf - 你找到解决方案了吗?请帮帮我.. 谢谢,内哈 这里有什么消息吗?如何排除字段? 【参考方案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);

【讨论】:

以上是关于Spring-data MongoDB地理查询的主要内容,如果未能解决你的问题,请参考以下文章

通过 spring-data 迭代 MongoDB 中的大型集合

在 MongoDB 的 spring-data 中配置 GridFS 模板

使用 Spring-Data 配置 MongoDb 时出现异常

如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

MongoDB地理空间查询结果未按距离顺序排列

mongodb地理定位索引和查询