使用命名集合时忽略@Indexed注释

时间:2013-07-29 01:21:55

标签: java spring mongodb spring-data spring-data-mongodb

我有一个这样的pojo注释:

@Document
class Car {

  @Id
  String id ;

  @Indexed
  String manufacturer ;

}

我正在使用MongoTemplate插入mongo。如果我插入而没有指定集合名称,一切正常。但是,如果我指定了集合名称,则除了_id之外,不会创建任何索引。

我真的需要能够手动指定集合名称,因为:

  • 我需要确保Car的不同子类最终出现在同一个集合中
  • 我想将每年的Cars存储在一个单独的集合中

我是否必须亲自致电ensureIndex()?如果是这样,有没有办法使用我的@Indexed注释?我试图保存的实际对象比“Car”

复杂得多

3 个答案:

答案 0 :(得分:5)

不幸的是MongoTemplate功能

public void insert(Object objectToSave, String collectionName)

仅将collectionName用于保存对象,而不是用于创建任何带注释的索引。 如果对象传递给保存操作,则应用程序事件侦听器MongoPersistentEntityIndexCreator扫描保存的@Indexed注释实体类并创建索引。但它根据下一个公式(来自消息来源)检测集合名称:

String collection = StringUtils.hasText(index.collection()) ? index.collection() : entity.getCollection();

其中index.collection()是来自@Indexed注释的集合,entity.getCollection()来自@Document注释。

因此,您需要手动调用ensureIndex()。 这是奇怪的行为。我想你可以在这里打开bug:DATAMONGO

修改 我认为您可以创建函数来返回所有使用@Document注释的类,并且还可以从cars.<year>开始从mongodb获取所有集合。然后,您可以分析使用@Indexed注释的所有字段,并因此使用集合列表为此字段调用ensureIndex

答案 1 :(得分:2)

  

我真的需要能够手动指定集合名称,因为:

I need to ensure different subclasses of Car end up in the same collection
I would like to store each year's worth of Cars in a separate collection

至于您的第一个声明,您可以使用@Document元数据注释强制执行单个集合:

@Document(collection="cars")
class Car {

    @Id
    String id ;

    @Indexed
    String manufacturer ;

}

@Document(collection="cars")
class Honda extends Car {

}

@Document(collection="cars")
class Volvo extends Car {

}

@Document的集合字段将关注汽车的每个子类进入汽车集合,并且在@Indexed注释的帮助下自动创建索引。

答案 2 :(得分:0)

您最好弯腰到数据库级别并使用getIndexes检查集合是否包含您需要的索引,并在应用程序启动时调用ensureIndex。

提示:在为您的应用程序配置mongo的类上实现InitializingBean并在那里发挥魔力。

没有讲道,恕我直言春天擅长某些事情,而另一些人也是如此。我试图避免除DI&amp;之外的膨胀非XA环境中的TXN管理。