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

Dav*_*ave 8 java spring mongodb spring-data spring-data-mongodb

我有一个像这样注释的pojo:

@Document
class Car {

  @Id
  String id ;

  @Indexed
  String manufacturer ;

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我必须ensureIndex()手动给自己打电话吗?如果是这样,有没有办法使用我的@Indexed注释?我试图保存的实际对象比"Car"要复杂得多

ser*_*.vi 5

不幸MongoTemplate功能

public void insert(Object objectToSave, String collectionName)
Run Code Online (Sandbox Code Playgroud)

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

String collection = StringUtils.hasText(index.collection()) ? index.collection() : entity.getCollection();
Run Code Online (Sandbox Code Playgroud)

这里index.collection()是收集@Indexed标注和entity.getCollection()@Document注释.

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

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