使用$ elemMatch在运算符中使用$时出错

时间:2013-09-03 18:09:07

标签: spring mongodb spring-data-mongodb

我正在使用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] }}}}

有什么建议吗?

此致

2 个答案:

答案 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);

现在它正在工作!

感谢所有人!