我正在使用spring-data-mongodb(版本1.0.2.RELEASE)和mongodb(版本2.2)。 我有一个对象A,其中包含一个对象位置列表。课程如下:
public class A {
@Id
private ObjectId id;
private List<Location> places;
//GETTER AND SETTER
}
public class Place {
private String name;
private String description;
@GeoSpatialIndexed
private double[] location;
//GETTER AND SETTER
}
我需要查找具有特定位置的所有对象A. 我试图将运营商$和$ elemMatch一起使用如下:
@Query(value = "{'places' : { $elemMatch: { location: {'$within' : {'$center' : [?0, ?1]} } }}}")
public List<A> findByLocation(Point location, double radius);
当我运行此查询时,我收到以下异常:
org.springframework.data.mongodb.UncategorizedMongoDbException:找不到特殊索引:2d for:{places:{$ elemMatch:{location:{$ within:{$ center:[{x:41.904159,y:12.549132 },0.07000000000000001]}}}}};嵌套异常是com.mongodb.MongoException:找不到特殊索引:2d for:{places:{$ elemMatch:{location:{$ within:{$ center:[{x:41.904159,y:12.549132},0.07000000000000001] }}}}
有什么建议吗?
此致
答案 0 :(得分:0)
显然location
属性上没有2d索引,MongoDB需要存在这样的索引。我不知道Spring是否应该自己创建索引,但如果没有,可以通过
db.collection.ensureIndex({"location":"2d"})
其中collection
被您的集合名称替换。
答案 1 :(得分:0)
我解决了改变A类的问题。我用一个org.springframework.data.mongodb.core.geo.Point列表替换了Place列表,如下所示:
public class A {
@Id
private ObjectId id;
@GeoSpatialIndexed
private List<Point> places;
//GETTER AND SETTER
}
我用新的查询替换了旧查询,如下所示:
@Query(value = "{'places' : {'$within' : {'$center' : [?0, ?1]} } }")
public List<A> findByLocation(Point location, double radius);
现在它正在工作!
感谢所有人!