我有一个mongodb集合,需要在某个进程开始之前清除它,我通过使用mongoTemplate.dropCollection()方法来执行此操作,因为它比在存储库中使用deleteall()方法要快得多.
当我引入索引时会出现问题,模型的注释如下:
@Document
public class TestModel {
@Indexed
private String testField;
}
和存储库
public interface TestModelRepository extends MongoRepository<TestModel, String> {
}
这样可以确保在应用程序启动时创建索引
我注意到通过使用存储库的deleteall()方法而不是删除集合可以保留索引,但是我想知道是否有一种使用spring-data的方法来确保在我插入时索引就位.
就像是
mongoTemplate.createIndexes( TestModel.class );
我怎样才能做到这一点?
解决方法:
没有这样的方法
mongoTemplate.createIndexes( TestModel.class );
删除之前,只需获取indexInfo,然后删除集合后,重新创建索引.
List<IndexInfo> indexInfo = mongoTemplate.indexOps(TestModel.class).getIndexInfo();
mongoTemplate.dropCollection(TestModel.class);
indexInfo.forEach(index -> {
DBObject indexOptions = new BasicDBObject();
if(! index.getName().equals("_id_"))
{
indexOptions.put(index.getName(), 1);
CompoundindexDeFinition indexDeFinition = new CompoundindexDeFinition(indexOptions);
indexDeFinition.named(index.getName());
mongoTemplate.indexOps(TestModel.class).ensureIndex(indexDeFinition);
}
});