spring-data-mongodb 3.0后默认不会自动创建索引
有三种方式可以解决:
首先对应的实体类上面需要有Document注解
1、修改配置(推荐,简单)
properties:
spring.data.mongodb.auto-index-creation=true
yaml:
spring:
data:
mognodb:
auto-index-creation: true
2、继承AbstractMongoClientConfiguration
修改代码中your_开头的属性,改为自己的mongodb连接配置
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
import java.util.Arrays;
@Configuration
public class MongoDBDataSourceConfig extends AbstractMongoClientConfiguration {
@Override
public MongoClient mongoClient() {
MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyToClusterSettings(builder ->builder.hosts(Arrays.asList(new ServerAddress(your_host, your_port))))
// 凭据
.credential(MongoCredential.createCredential(your_username, your_dbname,your_password.toCharArray()))
.build());
return mongoClient;
}
@Override
protected String getDatabaseName() {
return your_dbname;
}
@Override
protected boolean autoIndexCreation() {
return true;
}
}
3、手动获取索引执行
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.index.IndexOperations;
import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
@Slf4j
@RequiredArgsConstructor
@Configuration
public class MongoConfiguration {
private final MongoTemplate mongoTemplate;
private final MongoConverter mongoConverter;
@EventListener(ApplicationReadyEvent.class)
public void initIndicesAfterStartup() {
LOGGER.info("Mongo InitIndicesAfterStartup init");
long init = System.currentTimeMillis();
MappingContext mappingContext = this.mongoConverter.getMappingContext();
if (mappingContext instanceof MongoMappingContext) {
MongoMappingContext mongoMappingContext = (MongoMappingContext) mappingContext;
for (BasicMongoPersistentEntity<?> persistentEntity : mongoMappingContext.getPersistentEntities()) {
Class clazz = persistentEntity.getType();
if (clazz.isAnnotationPresent(Document.class)) {
MongoPersistentEntityIndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
IndexOperations indexOps = mongoTemplate.indexOps(clazz);
resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
}
}
}
LOGGER.info("Mongo InitIndicesAfterStartup take: {}", (System.currentTimeMillis() - init));
}
}