2015-12-09 18 views
6

tôi đang làm việc trên truy vấn không gian địa lý của MongoDB, tôi đã thực hiện sau đây truy vấn trên Mongo consolechỉ số cầu 2d trong dữ liệu mùa xuân MongoDB

db.items.find(
    { 
    location: 
     { $near : 
      { 
      $geometry: { type: "Point", coordinates: [77.026638, 28.459497 ] }, 
      $maxDistance: 10000 
      } 
     } 
    } 
) 

nhưng làm thế nào tôi có thể viết truy vấn này sử dụng tiêu chuẩn dữ liệu MongoDB mùa xuân?

Tôi đã cố gắng với việc sử dụng các tiêu chí sau đây, nhưng nó không làm việc

Criteria criteria = Criteria.where("location").near(new Point(77.026638, 28.459497)).maxDistance(1000); 

     Query query = new Query(criteria); 
System.out.println(mongoTemplate.find(query, Item.class)); 

Stack trace

org.springframework.data.mongodb.UncategorizedMongoDbException: Unable to execute query: error processing query: ns=geolocation.items limit=0 skip=0 
Tree: GEONEAR field=location maxdist=1.79769e+308 isNearSphere=0 
Sort: {} 
Proj: {} 
planner returned error: unable to find index for $geoNear query; nested exception is com.mongodb.MongoException: Unable to execute query: error processing query: ns=geolocation.items limit=0 skip=0 
Tree: GEONEAR field=location maxdist=1.79769e+308 isNearSphere=0 
Sort: {} 
Proj: {} 
planner returned error: unable to find index for $geoNear query 
    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:90) 
    at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:1940) 
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1823) 
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1633) 
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1616) 
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:535) 
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:526) 
    at com.samepinch.dao.item.ItemDao$$EPWN0nhQ.getItemsByLocation(ItemDao.java:200) 
    at com.samepinch.dao.item.ItemDao$$DPWN0nhQ.getItemsByLocation(Unknown Source) 
    at com.samepinch.dao.item.ItemDao.getItemsByLocation(ItemDao.java) 
    at com.samepinch.services.item.ItemService.getItemsByLocation(ItemService.java:410) 
    at com.samepinch.controllers.item.ItemController.getItemsbyLocation(ItemController.java:222) 
    at com.samepinch.controllers.item.ItemController$$FastClassBySpringCGLIB$$33bec54c.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:64) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
    at com.samepinch.controllers.item.ItemController$$EnhancerBySpringCGLIB$$7fa26c49.getItemsbyLocation(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springsource.loaded.ri.OriginalClassInvoker.invoke(OriginalClassInvoker.java:47) 
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1299) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at com.samepinch.mongodb.springsecurity.filters.AuthenticationFilter.doFilter(AuthenticationFilter.java:79) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.mongodb.MongoException: Unable to execute query: error processing query: ns=geolocation.items limit=0 skip=0 
Tree: GEONEAR field=location maxdist=1.79769e+308 isNearSphere=0 
Sort: {} 
Proj: {} 
planner returned error: unable to find index for $geoNear query 
    at com.mongodb.QueryResultIterator.throwOnQueryFailure(QueryResultIterator.java:214) 
    at com.mongodb.QueryResultIterator.init(QueryResultIterator.java:198) 
    at com.mongodb.QueryResultIterator.initFromQueryResponse(QueryResultIterator.java:176) 
    at com.mongodb.QueryResultIterator.<init>(QueryResultIterator.java:64) 
    at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:86) 
    at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66) 
    at com.mongodb.DBCursor._check(DBCursor.java:458) 
    at com.mongodb.DBCursor._hasNext(DBCursor.java:546) 
    at com.mongodb.DBCursor.hasNext(DBCursor.java:571) 
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1809) 
    ... 105 more 

schema của tôi là

@Document(collection = "items") 
public class Item extends BaseEntity{ 
    private static final long serialVersionUID = 1L; 

    private String itemName; 
    private MetadataEnum categoryName; 
    private List<SubtypeEnum> attributes; 
    private String registerBy; 
    boolean isAccessed; 
    private String imageUrl; 
    private CatagoryPreference catagoryPreference; 
    private Date startDate,endDate; 

    private Location location; 
} 

tài liệu nhúng là :)

public class Location { 

    private List<Double> coordinates; 
    private String type; 
    public List<Double> getCoordinates() { 
     return coordinates; 
    } 
    public void setCoordinates(List<Double> coordinates) { 
     this.coordinates = coordinates; 
    } 
    public String getType() { 
     return type; 
    } 
    public void setType(String type) { 
     this.type = type; 
    } 

    public Double getRadius() { 
     return radius; 
    } 
    public void setRadius(Double radius) { 
     this.radius = radius; 
    } 

    private Double radius; 

} 

Thậm chí tôi thấy chỉ số hệ thống đảm bảo

{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.notification" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.preference" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.userItemHistory" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.media" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.userBasedRecommendation" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.users" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.authenticationToken" } 
{ "v" : 1, "unique" : true, "key" : { "username" : 1 }, "name" : "username", "ns" : "geolocation.users" } 
{ "v" : 1, "unique" : true, "key" : { "email" : 1 }, "name" : "email", "ns" : "geolocation.users" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.userToUserHistory" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.metadata" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.mongo_data_model_map" } 
{ "v" : 1, "key" : { "element_id" : 1 }, "name" : "element_id_1", "ns" : "geolocation.mongo_data_model_map" } 
{ "v" : 1, "key" : { "long_value" : 1 }, "name" : "long_value_1", "ns" : "geolocation.mongo_data_model_map" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.preferenceOrder" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.counter" } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.item" } 
{ "v" : 1, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "ns" : "geolocation.item", "2dsphereIndexVersion" : 2 } 
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "geolocation.items" } 
{ "v" : 1, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "ns" : "geolocation.items", "2dsphereIndexVersion" : 2 } 
Type "it" for more 
> it 
{ "v" : 1, "key" : { "a" : 1 }, "name" : "a_1", "ns" : "geolocation.items" } 

My kỷ lục cơ sở dữ liệu trông giống như

{ 
    "_id" : NumberLong(46602), 
    "_class" : "com.samepinch.domain.item.Item", 
    "itemName" : "Chandigarh", 
    "categoryName" : "TRAVELLING", 
    "attributes" : [ 
     "MOUNTAIN" 
    ], 
    "isAccessed" : false, 
    "imageUrl" : "0bbd8cdb-be5c-4efc-b974-c04fb1903537itemcompressed.jpg", 
    "catagoryPreference" : "BOTH", 
    "startDate" : ISODate("2015-12-09T18:30:00Z"), 
    "endDate" : ISODate("2015-12-09T18:30:00Z"), 
    "location" : { 
     "coordinates" : [ 
      76.76641440000003, 
      30.72642125251779 
     ], 
     "type" : "Point", 
     "radius" : 8504.948210235696 
    }, 
    "createdDate" : ISODate("2015-12-09T10:27:42.519Z"), 
    "updatedDate" : ISODate("2015-12-09T10:27:42.519Z") 
} 

Tôi đã tạo ra chỉ số spheare 2d vào bộ sưu tập, nhưng tôi không biết tại sao nó là cho tôi lỗi này.

+0

bạn đã thử sử dụng 'GeoJsonPoint' thay vì 'Điểm' để chỉ ra việc sử dụng định dạng GeoJSON? Bạn đang sử dụng phiên bản nào của spring-data-mongodb, mongo-java-driver và máy chủ mongodb? –

+0

Tôi đang sử dụng dữ liệu mùa xuân mongodb v 1.7.1 và trình điều khiển mongo java 2.13.0 –

+1

cảm ơn, xấu của tôi - hoàn toàn bị bỏ qua mà bạn cần sử dụng 'nearSphere' ->' Criteria.where ("location"). NearSphere (new GeoJsonPoint (77.026638, 28.459497)). Ma ... ' –

Trả lời

1

Thay đổi dữ liệu lưu trữ thay vì:

"location" : { 
    "coordinates" : [ 
     76.76641440000003, 
     30.72642125251779 
    ], 
    "type" : "Point", 
    "radius" : 8504.948210235696 
} 

để

"location" : { 
    "coordinates" : [ 
     76.76641440000003, 
     30.72642125251779 
    ], 
    "type" : "Point" 
} 

Tôi nghĩ rằng cho "Point" loại mà bạn có kiểu dữ liệu sai. Nó chỉ nên có kinh độ, vĩ độ cho tọa độ địa lý. Bạn không nên bao gồm "raduis".

Kiểm tra hợp lệ GeoJsons.

0

Ngay cả khi tôi gặp sự cố này. Sau rất nhiều cuộc đấu tranh tôi tìm thấy nó mà không cần sử dụng tiêu chí. Điều này dưới đây là sử dụng không sử dụng mùa xuân ... tức là. chỉ java Điều này chắc chắn sẽ giúp bạn ra ngoài

MongoClient mongoClient = new MongoClient("localhost" , 27017); 
    DB db = mongoClient.getDB("services"); 
    DBCollection collection= db.getCollection("timezone"); 
    BasicDBObject point = new BasicDBObject("type", "Point"); 
    double[] ptCordinate={lat,longi}; 
    point.put("coordinates", ptCordinate); 

    BasicDBObject query = new BasicDBObject(
     "geometry", new BasicDBObject(
      "$near", new BasicDBObject(
       "$geometry", point 
      ) 
     ) 
    ); 
    collection.findOne(query); 
Các vấn đề liên quan