4.0、创建索引
索引在所有的数据库中,暂居的位置非常重要,例如当你检索一张上百万的数据表的时候,如果没走索引,查询效率会极其缓慢,对于 MongoDB 来说,同样如此。
示例如下:
- 创建升序索引
@RunWith(SpringRunner.class) @SpringBootTest public class PersonServiceTest { @Autowired private MongoTemplate mongoTemplate; /** * 创建升序索引 */ @Test public void createAscendingIndex() { // 设置字段名称 String field = "userName"; // 创建索引 mongoTemplate.getCollection("persons").createIndex(Indexes.ascending(field)); } }
- 移除索引
@RunWith(SpringRunner.class) @SpringBootTest public class PersonServiceTest { @Autowired private MongoTemplate mongoTemplate; /** * 根据索引名称移除索引 */ @Test public void removeIndex() { // 设置字段名称 String field = "userName"; // 删除索引 mongoTemplate.getCollection("persons").dropIndex(field); } }
- 查询集合中所有的索引
@RunWith(SpringRunner.class) @SpringBootTest public class PersonServiceTest { @Autowired private MongoTemplate mongoTemplate; /** * 查询集合中所有的索引 */ @Test public void getIndexAll() { // 获取集合中所有列表 ListIndexesIterable<Document> indexList = mongoTemplate.getCollection("persons").listIndexes(); // 获取集合中全部索引信息 for (Document document : indexList) { System.out.println("索引列表:" + document); } } }
- 我们还可以通过在实体类上加注解方式来创建索引
/** * 使用@Document注解指定集合名称 */ @Document(collection="persons") public class Person implements Serializable { private static final long serialVersionUID = -3258839839160856613L; /** * 使用@Id注解指定MongoDB中的 _id 主键 */ @Id private Long id; private String userName; private String passWord; private Integer age; /** * 创建一个5秒之后文档自动删除的索引 */ @Indexed(expireAfterSeconds=5) private Date createTime; //...get/set @Override public String toString() { return "Person{" + "id=" + id + ", userName='" + userName + '\'' + ", passWord='" + passWord + '\'' + ", age=" + age + ", createTime=" + createTime + '}'; } }
4.1、引入 MongoDB 中的事务
单节点 mongodb 不支持事务,需要搭建 MongoDB 复制集。
/** * 配置事务管理器 * */ @Configuration public class TransactionConfig { @Bean MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { return new MongoTransactionManager(dbFactory); } }
事务服务测试!
@Service public class TransactionExample { @Autowired private MongoTemplate mongoTemplate; @Transactional(rollbackFor = Exception.class) public Object transactionTest(){ Person person =new Person(); person.setId(1l); person.setUserName("张三"); person.setPassWord("123456"); person.setCreateTime(new Date()); Person newPerson = mongoTemplate.insert(person); // 抛出异常,观察数据是否进行回滚 if(1 == 1){ throw new RuntimeException("异常"); } return newPerson; } }
四、小结
本文主要围绕 MongoDB 的 Java 客户端使用进行基本的增删改查操作介绍,在实际的业务场景中,可能还需要用到聚合函数等高级查询,大家如果有这种需求,可以访问如下地址获取更加详细的 api 文档介绍:MongoDB 文档查询 api 介绍
demo获取地址:https://github.com/justdojava/springboot-example-mongodb
五、参考
1、菜鸟教程 - mongodb
2、超级小豆丁 - MongoDB 介绍