2016-01-17 3 views
1

Я хотел бы найти ближайший магазин. Так что я написал этот код:Весенние данные Mongodb Near Query not works

public class ShopRepositoryImpl extends GenericRepositoryImpl<ShopEntity, String> implements ShopRepositoryCustom { 

    @Autowired 
    protected MongoTemplate template; 

    @Override 
    public GeoResult<ShopEntity> findNearest(Point location) { 
     List<GeoResult<ShopEntity>> result = template.geoNear(
       NearQuery.near(location).maxDistance(new Distance(70, Metrics.KILOMETERS)) 
         .query(new Query(Criteria.where("location")).limit(1)), 
       ShopEntity.class).getContent(); 
     if (result.isEmpty()) { 
      return null; 
     } else { 
      return result.get(0); 
     } 
    } 
} 

В TOMCAT консоли есть:

2016-01-17 12:13:26.151 WARN 645 --- [nio-8080-exec-2]  o.s.data.mongodb.core.MongoTemplate  : Command execution of 
{ "geoNear" : "shop" , "query" : { "location" : { }} , "maxDistance" : 0.010974991600211786 , "distanceMultiplier" : 6378.137 , "num" : 1 , "near" : [ 48.8703939 , 2.0] , "spherical" : true} 
failed: no geo indices for geoNear 

И я попытался это:

public interface ShopRepository extends GenericRepository<ShopEntity, String>, ShopRepositoryCustom { 
    GeoResults<ShopEntity> findByLocationNear(Point location, Distance distance); 
} 

Нет результата

В моей базе данных у меня есть один элемент:

{ 
    "name": "A shop", 
    "street": "149 Rue Montmartre", 
    "city": "Paris", 
    "zip": "75002", 
    "country": "France", 
    "location": { 
     "x": 48.8703937, 
     "y": 2.3422999 
    } 
    } 
+0

моей сущности есть: @GeoSpatialIndexed частного двойное [] местоположения; – Maryo

ответ

0

У меня были некоторые проблемы с рядом запроса в последнее время, что я решил следующим образом:

mongoTemplate.indexOps(MyClass.class).ensureIndex(new GeospatialIndex("attribute.holding.coordinates")); 
NearQuery nearQuery = NearQuery.near(x, y); 
final GeoResults<MyClass> geoResults = mongoTemplate.geoNear(nearQuery, MyClass.class); 
return geoResults.getContent().stream().map(GeoResult::getContent).collect(Collectors.toList()); 

Это явно относится геопространственную индекс, а затем использует его для поиска близлежащих объектов.

+0

Не работает :(2016-02-01 01: 24: 42.273 WARN 13601 --- [nio-8080-exec-1] osdata.mongodb.core.MongoTemplate: Выполнение команды {"geoNear": "shop" , «рядом»: [48.8865967, 2.0], «сферический»: false} не удалось: более одного индекса 2d, не уверен, что запускать geoNear on – Maryo

0

Вы можете просто использовать простую аннотацию @Query. Укажите свой атрибут местоположения, запустив в командной строке mongod: db.yourCollection.createIndex({ location : "2dsphere" }). Затем с помощью аннотаций запроса в вашем MongoRepository:

@Repository 
public interface ShopRepository extends MongoRepository<Shop, String>{ 

    @Query(value = "{\"location\":\n" + 
"  { $near :\n" + 
"   {\n" + 
"   $geometry : {\n" + 
"    type : \"Point\" ,\n" + 
"    coordinates : [ ?0, ?1] }\n" + 
"   }\n" + 
"  }}") 
    public List<Shop> nearByShops(double longitude, double latitude); 

} 
Смежные вопросы