Mongodb 为什么在使用GeoJsonPoint执行nearSphere查询时会出现CodeConfigurationException?
这个问题使我困惑。因此,我有一个UserModel,在这里我使用一个Mongodb 为什么在使用GeoJsonPoint执行nearSphere查询时会出现CodeConfigurationException?,mongodb,spring-boot,geojson,spring-data-mongodb,bson,Mongodb,Spring Boot,Geojson,Spring Data Mongodb,Bson,这个问题使我困惑。因此,我有一个UserModel,在这里我使用一个org.springframework.data.mongodb.core.geo.GeoJsonPoint对象存储用户最后已知的坐标,该对象转换为 “LastKnown坐标”:{ “类型”:“点”, “坐标”:[77.596503,12.966267] } 我有一个偏移集合,它映射到偏移模型对象。每个游览都有一个geolocation属性,该属性使用GeoJsonPoint规范存储其位置,如下所示: “地理定位”:{ “坐标
org.springframework.data.mongodb.core.geo.GeoJsonPoint
对象存储用户最后已知的坐标,该对象转换为
“LastKnown坐标”:{
“类型”:“点”,
“坐标”:[77.596503,12.966267]
}
我有一个偏移集合,它映射到偏移模型
对象。每个游览都有一个geolocation属性,该属性使用GeoJsonPoint
规范存储其位置,如下所示:
“地理定位”:{
“坐标”:[73.739978,15.606188],
“类型”:“点”
}
现在,当用户试图添加附近的过滤器以获取指定距离内的偏移时,我在查询对象(org.springframework.data.mongodb.core.query.query
)上添加了一个$nearSphere
条件,如下所示
if(userRequest.getDistInMeters()!=null){
query.addCriteria(Criteria.where(“地理位置”)
.nearSphere(userModel.getLastKnown坐标())
.maxDistance(userRequest.getDistInMeters())
);
}
从技术上讲,这应转化为以下内容:
。。。
“地理定位”:{
$nearSphere:{
$geometry:{
键入:“点”,
座标:[77.596503,12.966267]
},
$maxDistance:10000
}
}...
(如果distInMeters=10000)
但是,我认为这相当于:
。。。
“地理定位”:{
“$nearSphere”:{
“$geometry”:{
“$java”:点[x=-3.703790,y=40.416775]
}
}
}...
请注意,GeoJsonPoint
的转换不正确。我还得到以下异常
org.bson.codecs.configuration.CodecConfigurationException:找不到类org.springframework.data.mongodb.core.geo.GeoJsonPoint的编解码器。
产出全文:
路径为[]的上下文中Servlet[dispatcherServlet]的Servlet.service()引发异常[请求处理失败;嵌套异常为org.bson.codecs.configuration.CodecConfigurationException:找不到类org.springframework.data.mongodb.core.geo.GeoJsonPoint.]的编解码器,其根本原因是
org.bson.codecs.configuration.CodecConfigurationException:找不到类org.springframework.data.mongodb.core.geo.GeoJsonPoint的编解码器。
位于org.bson.internal.CodecCache.getorhrow(CodecCache.java:57)
位于org.bson.internal.ProvidersCodeRegistry.get(ProvidersCodeRegistry.java:64)
位于org.bson.internal.ChildCodecRegistry.get(ChildCodecRegistry.java:52)
位于org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:197)
位于org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:212)
位于org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:195)
位于org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:212)
位于org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:195)
位于org.bson.codecs.DocumentCodec.writeMap(DocumentCodec.java:212)
位于org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:154)
位于org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:45)
位于org.bson.BsonDocumentWrapper.getUnwrapped(BsonDocumentWrapper.java:195)
位于org.bson.BsonDocumentWrapper.isEmpty(BsonDocumentWrapper.java:115)
位于com.mongodb.internal.operation.DocumentHelper.putIfNotNullOrEmpty(DocumentHelper.java:43)
位于com.mongodb.internal.operation.findoOperation.getCommand(findoOperation.java:792)
访问com.mongodb.internal.operation.findoOperation.access$1600(findoOperation.java:77)
位于com.mongodb.internal.operation.findoOperation$4.create(findoOperation.java:858)
位于com.mongodb.internal.operation.CommandOperationHelper.executeCommandWithConnection(CommandOperationHelper.java:219)
位于com.mongodb.internal.operation.findoOperation$1.call(findoOperation.java:631)
位于com.mongodb.internal.operation.findoOperation$1.call(findoOperation.java:625)
位于com.mongodb.internal.operation.OperationHelper.withReadConnectionSource(OperationHelper.java:462)
位于com.mongodb.internal.operation.findoOperation.execute(findoOperation.java:625)
位于com.mongodb.internal.operation.findoOperation.execute(findoOperation.java:77)
位于com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:190)
位于com.mongodb.client.internal.mongoiterableempl.execute(mongoiterableempl.java:135)
位于com.mongodb.client.internal.mongoiterableempl.iterator(mongoiterableempl.java:92)
位于com.example.commercial.backend.dao.shiftiondao.getAllExcursions(shiftionsdao.java:140)
位于com.example.commercial.backend.service.touringservice.getAllExcursions(touringService.java:70)
位于com.example.commercial.backend.controller.shiftioncontroller.getAllExcursions(shiftionController.java:38)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
位于org.springframework.web.servlet.mvc.method.annotation.ServletinVaccableHandlerMethod.invokeAndHandle(ServletinVaccableHandlerMethod.java:105)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
位于org.springframework.web.servlet.mvc.method.Abs
Criteria criteria = Criteria.where(key).is(value);
Query query = Query.query(criteria).skip(num).limit(num);
List<ExcursionsModel> excursions = mongoTemplate.find(query, ExcursionsModel.class);
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.geo.Metrics;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.GeoNearOperation;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.index.GeospatialIndex;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query;
import java.util.ArrayList;
import java.util.List;
@SpringBootApplication
public class So63886374Application {
public static void main(String[] args) {
SpringApplication.run(So63886374Application.class, args);
}
@Autowired
private MongoTemplate mongoTemplate;
public void queryData() {
//Distance from fort worth - 45 miles - output dallas - 200 miles - austin/dallas - 300 miles - austin/dallas/houston
Criteria criteria = Criteria.where("geolocation").nearSphere(new GeoJsonPoint(-97.3327459, 32.753177)).maxDistance(200*1609.34);
Query query = Query.query(criteria);
List<ExcursionsModel> excursionsModels = mongoTemplate.find(query, ExcursionsModel.class);
excursionsModels.forEach(es -> System.out.println(es.getGeolocation()));
//Aggregation query to capture distance
NearQuery nearQuery = NearQuery.near(-97.3327459, 32.753177, Metrics.MILES).maxDistance(200);
GeoNearOperation geoNearOperation = Aggregation.geoNear(nearQuery, "distanceFromFW");
Aggregation aggregation = Aggregation.newAggregation(geoNearOperation);
List<ExcursionsModel> excursionsModelsAg = mongoTemplate.aggregate(aggregation, ExcursionsModel.class, ExcursionsModel.class).getMappedResults();
excursionsModelsAg.forEach(es -> System.out.println(es.getDistanceFromFW()));
}
@Document
public class ExcursionsModel {
@GeoSpatialIndexed(name = "geoIndex", type = GeoSpatialIndexType.GEO_2DSPHERE)
private GeoJsonPoint geolocation;
private long distanceFromFW;
public void setGeolocation(GeoJsonPoint geolocation) {
this.geolocation = geolocation;
}
public GeoJsonPoint getGeolocation() {
return geolocation;
}
public long getDistanceFromFW() {
return distanceFromFW;
}
public void setDistanceFromFW(long distanceFromFW) {
this.distanceFromFW = distanceFromFW;
}
}
public void insertData() {
List<ExcursionsModel> excursionsModels = new ArrayList<>();
mongoTemplate.indexOps(ExcursionsModel.class).ensureIndex(new GeospatialIndex("geolocation").named("geoIndex").typed(GeoSpatialIndexType.GEO_2DSPHERE));
ExcursionsModel austin = new ExcursionsModel();
austin.setGeolocation(new GeoJsonPoint( -97.7436995, 30.2711286));
ExcursionsModel houston = new ExcursionsModel();
houston.setGeolocation(new GeoJsonPoint(-95.3676974, 29.7589382));
ExcursionsModel dallas = new ExcursionsModel();
dallas.setGeolocation(new GeoJsonPoint(-96.7968559, 32.7762719));
excursionsModels.add(austin);
excursionsModels.add(houston);
excursionsModels.add(dallas);
mongoTemplate.insert(excursionsModels, ExcursionsModel.class);
}
public void dropData() {
mongoTemplate.dropCollection(ExcursionsModel.class);
}
@Bean
public ApplicationRunner runner() {
return args -> {
dropData();
insertData();
queryData();
};
}
}
Point [x=-96.796856, y=32.776272] //Dallas
Point [x=-97.743700, y=30.271129] //Austin
31
173
public void queryData() {
//Distance from fort worth - 45 miles - output dallas - 200 miles - austin/dallas - 300 miles - austin/dallas/houston
MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("test");
Point refPoint = new Point(new Position(-97.3327459, 32.753177));
Bson filters = Filters.nearSphere("geolocation", refPoint, 200*1609.34, 0.0);
CodecRegistry pojoCodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().register(ExcursionsModel.class).build()));
FindIterable<ExcursionsModel> excursionsModels = database.getCollection("excursionsmodel", ExcursionsModel.class).withCodecRegistry(pojoCodecRegistry).find(filters);
excursionsModels.forEach(es -> System.out.println(es.getGeolocation()));
}
public static class ExcursionsModel {
private Point geolocation;
public void setGeolocation(Point geolocation) {
this.geolocation = geolocation;
}
public Point getGeolocation() {
return geolocation;
}
}
Point{coordinate=Position{values=[-96.7968559, 32.7762719]}}
Point{coordinate=Position{values=[-97.7436995, 30.2711286]}}
db.user.createIndex({ geolocation : "2dsphere" } );