MongoTemplate 提供了一些管理索引和集合的方法,这些方法被收集到一个名为 IndexOperations 的助手接口中。可以通过调用 MongoTemplate.indexOps() 方法,并传入集合名称或实体的 java.lang.Class 来访问这些操作。indexOps() 方法定义如下:
IndexOperations indexOps(Class<?> entityClass) 通过 Class 返回可以对索引进行操作的 IndexOperations 对象
IndexOperations indexOps(String collectionName) 通过集合名返回可以对索引进行操作的 IndexOperations 对象
IndexOperations indexOps(String collectionName, Class<?> type) 通过集合名和 Class 返回可以对索引进行操作的 IndexOperations 对象
下面显示了 IndexOperations 接口方法定义:
public interface IndexOperations { // 创建索引 void ensureIndex(IndexDefinition indexDefinition); // 删除集合中名为 name 的索引 void dropIndex(String name); // 删除集合中所有索引 void dropAllIndexes(); // 重置索引缓存 void resetIndexCache(); // 获取索引信息 List<IndexInfo> getIndexInfo(); }
你可以通过使用MongoTemplate类在一个集合上创建一个索引来提高查询性能,如下例所示:
Index index = new Index().on("name", Sort.Direction.ASC); mongoTemplate.indexOps(Person.class).ensureIndex(index);
注意:ensureIndex() 方法确保所提供的 IndexDefinition 的索引在集合中存在。
你还可以通过使用 IndexDefinition、GeoSpatialIndex 和 TextIndexDefinition 类来创建标准、地理空间和文本类型索引。例如,在 Venue 类对应的集合上声明一个地理空间查询索引,如下所示:
GeospatialIndex geoIndex = new GeospatialIndex("location"); mongoTemplate.indexOps(Person.class).ensureIndex(geoIndex);
(1)application.properties 配置文件
# Log logging.level.root=debug # MongoDB spring.data.mongodb.uri=mongodb://localhost:27017/test
(2)AppConfig.java 配置类,配置 MongoTemplate 对象
import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.MongoTemplate; /** * 配置 MongoTemplate * @author hxstrive.com 2022/12/23 */ @Slf4j @Configuration public class AppConfig { @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDatabaseFactory) { log.info("mongoTemplate({}, {})", mongoDatabaseFactory); return new MongoTemplate(mongoDatabaseFactory); } }
(3)集合 person 对应的实体
import lombok.Builder; import lombok.Data; import lombok.ToString; @Data @ToString @Builder public class Person { /** 用户ID */ private int id; /** 用户姓名 */ private String name; /** 年龄 */ private int age; }
(4)客户端代码,说明见注释。
import com.hxstrive.springdata.mongodb.entity.Person; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.index.GeospatialIndex; import org.springframework.data.mongodb.core.index.Index; /** * 创建索引示例 * @author hxstrive.com */ @SpringBootTest public class IndexManagementDemo1 { @Autowired private MongoTemplate mongoTemplate; @BeforeEach public void init() { mongoTemplate.dropCollection(Person.class); // 准备数据 mongoTemplate.insert(Person.builder().id(100).name("Tom").age(27).build()); mongoTemplate.insert(Person.builder().id(200).name("Helen").age(30).build()); mongoTemplate.insert(Person.builder().id(300).name("Bill").age(47).build()); mongoTemplate.insert(Person.builder().id(400).name("Joe").age(20).build()); } // 创建简单索引 @Test public void contextLoads() { Index index = new Index().on("name", Sort.Direction.ASC); String val = mongoTemplate.indexOps(Person.class).ensureIndex(index); System.out.println("val=" + val); // 结果: // val=name_1 // 执行的语句如下: // { // "createIndexes": "person", // "indexes": [{"key": {"name": 1}, "name": "name_1"}], // "$db": "test", // "lsid": {"id": {"$binary": {"base64": "rHmCzMRCRkCcjb0yWTzF3w==", "subType": "04"}}} // } } // 创建地理空间索引 @Test public void contextLoads2() { GeospatialIndex geoIndex = new GeospatialIndex("location"); String val = mongoTemplate.indexOps(Person.class).ensureIndex(geoIndex); System.out.println("val=" + val); // 结果: // val=location_2d // 执行的语句如下: // { // "createIndexes": "person", // "indexes": [{"key": {"location": "2d"}, "name": "location_2d"}], // "$db": "test", // "lsid": {"id": {"$binary": {"base64": "RqfA+vouQOOfPpz8TfBQbw==", "subType": "04"}}} // } } }