使用背景
项目中偶尔需要对接大数据平台组,因为对接方有使用MongoDB,因此也需要做一些关于MongoDB的简要工作。
使用MongoTemplate
官方提供了三种构造方法,可以根据不同需求去构造使用:
在项目中只需要简单添加MongoDBConfig,通过url去获取连接即可。MongoTemplate是MongoOperations的实现,也提供了很多基本操作方法。
1.创建一个集合
创建方式有三种:
createCollection(Class<T> entityClass)
createCollection(Class<T> entityClass, CollectionOptions collectionOptions)
createCollection(String collectionName)
一般通过mongTemplate使用第三种的情况比较多:
/**
* 功能描述: 创建一个集合
* 同一个集合中可以存入多个不同类型的对象,我们为了方便维护和提升性能,
* 后续将限制一个集合中存入的对象类型,即一个集合只能存放一个类型的数据
*
* @param name 集合名称,相当于传统数据库的表名
* @return:void
*/
public void createCollection(String name) {
mongoTemplate.createCollection(name);
}
2.创建索引
/**
* 功能描述: 创建索引
* 索引是顺序排列,且唯一的索引
*
* @param collectionName 集合名称,相当于关系型数据库中的表名
* @param filedName 对象中的某个属性名
* @return:java.lang.String
*/
public String createIndex(String collectionName, String filedName) {
//配置索引选项
IndexOptions options = new IndexOptions();
// 设置为唯一
options.unique(true);
//创建按filedName升序排的索引
return mongoTemplate.getCollection(collectionName).createIndex(Indexes.ascending(filedName), options);
}
3.获取索引
/**
* 功能描述: 获取当前集合对应的所有索引的名称
*
* @param collectionName
* @return:java.util.List<java.lang.String>
*/
public List<String> getAllIndexes(String collectionName) {
ListIndexesIterable<Document> list = mongoTemplate.getCollection(collectionName).listIndexes();
//上面的list不能直接获取size,因此初始化arrayList就不设置初始化大小了
List<String> indexes = new ArrayList<>();
for (org.bson.Document document : list) {
document.entrySet().forEach((key) -> {
//提取出索引的名称
if (key.getKey().equals("name")) {
indexes.add(key.getValue().toString());
}
});
}
return indexes;
}
4.基本CRUD
/**
* 功能描述: 往对应的集合中插入一条数据
*
* @param info 存储对象
* @param collectionName 集合名称
* @return:void
*/
public void insert(T info, String collectionName) {
mongoTemplate.insert(info, collectionName);
}
/**
* 功能描述: 往对应的集合中批量插入数据,注意批量的数据中不要包含重复的id
*
* @param infos 对象列表
* @return:void
*/
public void insertMulti(List<T> infos, String collectionName) {
mongoTemplate.insert(infos, collectionName);
}
/**
* 功能描述: 使用索引信息精确更改某条数据
*此处需要说明的是Mongodb的修改操作大致有3种:
*mongoTemplate.updateFirst操作:修改第一条
*mongoTemplate.updateMulti操作:修改符合条件的所有
*mongoTemplate.upsert操作:修改时如果不存在则添加.
* @param id 唯一键
* @param collectionName 集合名称
* @param info 待更新的内容
* @return:void
*/
public void updateById(String id, String collectionName, T info) {
Query query = new Query(Criteria.where("id").is(id));
Update update = new Update();
String str = JSON.toJSONString(info);
JSONObject jQuery = JSON.parseObject(str);
jQuery.forEach((key, value) -> {
//因为id相当于传统数据库中的主键,这里使用时就不支持更新,所以需要剔除掉
if (!key.equals("id")) {
update.set(key, value);
}
});
mongoTemplate.updateMulti(query, update, info.getClass(), collectionName);
}
/**
* 功能描述: 根据id删除集合中的内容
*
* @param id 序列id
* @param collectionName 集合名称
* @param clazz 集合中对象的类型
* @return:void
*/
public void deleteById(String id, Class<T> clazz, String collectionName) {
// 设置查询条件,当id=#{id}
Query query = new Query(Criteria.where("id").is(id));
// mongodb在删除对象的时候会判断对象类型,如果你不传入对象类型,只传入了集合名称,它是找不到的
// 上面我们为了方便管理和提升后续处理的性能,将一个集合限制了一个对象类型,所以需要自行管理一下对象类型
// 在接口传入时需要同时传入对象类型
mongoTemplate.remove(query, clazz, collectionName);
}
/**
* 功能描述: 根据id查询信息
*
* @param id 注解
* @param clazz 类型
* @param collectionName 集合名称
* @return:java.util.List<T>
*/
public T selectById(String id, Class<T> clazz, String collectionName) {
// 查询对象的时候,不仅需要传入id这个唯一键,还需要传入对象的类型,以及集合的名称
return mongoTemplate.findById(id, clazz, collectionName);
}
/**
* 功能描述: 查询列表信息
* 将集合中符合对象类型的数据全部查询出来
*
* @param collectName 集合名称
* @param clazz 类型
* @return:java.util.List<T>
*/
public List<T> selectList(String collectName, Class<T> clazz) {
return selectList(collectName, clazz, null, null);
}
/**
* 功能描述: 分页查询列表信息
*
* @param collectName 集合名称
* @param clazz 对象类型
* @param currentPage 当前页码
* @param pageSize 分页大小
* @return:java.util.List<T>
*/
public List<T> selectList(String collectName, Class<T> clazz, Integer currentPage, Integer pageSize) {
//设置分页参数
Query query = new Query();
//设置分页信息
if (!ObjectUtils.isEmpty(currentPage) && ObjectUtils.isEmpty(pageSize)) {
query.limit(pageSize);
query.skip(pageSize * (currentPage - 1));
}
return mongoTemplate.find(query, clazz, collectName);
}
/**
* 功能描述: 根据条件查询集合
*
* @param collectName 集合名称
* @param conditions 查询条件,目前查询条件处理的比较简单,仅仅做了相等匹配,没有做模糊查询等复杂匹配
* @param clazz 对象类型
* @param currentPage 当前页码
* @param pageSize 分页大小
* @return:java.util.List<T>
*/
public List<T> selectByCondition(String collectName, Map<String, String> conditions, Class<T> clazz, Integer currentPage, Integer pageSize) {
if (ObjectUtils.isEmpty(conditions)) {
return selectList(collectName, clazz, currentPage, pageSize);
} else {
//设置分页参数
Query query = new Query();
query.limit(pageSize);
query.skip(currentPage);
// 往query中注入查询条件
conditions.forEach((key, value) -> query.addCriteria(Criteria.where(key).is(value)));
return mongoTemplate.find(query, clazz, collectName);
}
}
/**
* 功能描述: 根据条件查询集合
* @param collectName 集合名称
* @param query 查询条件
* query中可以使用addCriteria添加查询条件
* 用法:query.addCriteria(Criteria.where(key).is(value))
* @param clazz 对象类型
* @return
*/
public List<T> selectByQuery(String collectName,Query query,Class<T> clazz){
List<T> result= mongoTemplate.find(query,clazz,collectName);
return result;
}