Spring Data MongoDB 教程

集合管理

下面示例显示了怎样去创建一个集合:

MongoCollection<Document> collection = null;
// 判断 MyNewCollection 集合是否存在
if (!mongoTemplate.getCollectionNames().contains("MyNewCollection")) {
   // 如果 MyNewCollection 集合不存在,则创建该集合
   collection = mongoTemplate.createCollection("MyNewCollection");
}

// 删除集合
mongoTemplate.dropCollection("MyNewCollection");

下面列出了关于集合管理的方法:

获取集合信息

  • Set<String> getCollectionNames() 获取所有集合名称

  • com.mongodb.client.MongoCollection<org.bson.Document> getCollection(String collectionName) 按名称获取MongoCollection。

  • String getCollectionName(Class<?> entityClass) 根据 Class 获取对应的集合名称

判断集合是否存在

  • <T> boolean collectionExists(Class<T> entityClass) 检查是否存在具有由实体类指示的名称的集合。

  • boolean collectionExists(String collectionName) 检查是否存在具有给定名称的集合。

创建集合

  • <T> com.mongodb.client.MongoCollection<org.bson.Document> createCollection(Class<T> entityClass) 使用基于提供的实体类的名称创建无上限集合。

  • <T> com.mongodb.client.MongoCollection<org.bson.Document> createCollection(Class<T> entityClass, CollectionOptions collectionOptions) 使用选项创建具有基于提供的实体类的名称的集合。

  • com.mongodb.client.MongoCollection<org.bson.Document> createCollection(String collectionName) 使用提供的名称创建无上限集合。

  • com.mongodb.client.MongoCollection<org.bson.Document> createCollection(String collectionName, CollectionOptions collectionOptions) 使用提供的名称和选项创建集合。

删除集合

  • <T> void dropCollection(Class<T> entityClass) 使用实体类指示的名称删除集合。

  • void dropCollection(String collectionName) 删除具有给定名称的集合。

完整示例

(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 com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import java.util.Set;

/**
* 集合管理示例
* @author hxstrive.com
*/
@SpringBootTest
public class CollectionManagementDemo {

   @Autowired
   private MongoTemplate mongoTemplate;

   @Test
   public void contextLoads() {
       // 创建集合,先判断集合是否存在
       if(!mongoTemplate.getCollectionNames().contains("person")) {
           MongoCollection<Document> result = mongoTemplate.createCollection(Person.class);
           System.out.println(result);
           // 结果:
           // com.mongodb.client.internal.MongoCollectionImpl@6cfbbff7
       }

       if(!mongoTemplate.collectionExists("myPerson")) {
           MongoCollection<Document> result = mongoTemplate.createCollection("myPerson");
           System.out.println(result);
           // 结果:
           // com.mongodb.client.internal.MongoCollectionImpl@136ccbfe
       }

       // 获取当前数据库下面所有的集合名称
       Set<String> collectionNames = mongoTemplate.getCollectionNames();
       for(String collectionName : collectionNames) {
           System.out.println(collectionName);
           // 结果:
           // myPerson
           // person
       }

       // 删除集合
       for(String collectionName : collectionNames) {
           mongoTemplate.dropCollection(collectionName);
       }
   }

}
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号