前言
因为在做的一个demo项目需要使用mongodb这种非关系型数据库,这里记录下这次的学习的收获,主要是用springdata的MongoTemplate对其进行的基本增删改查操作。对于mogodb数据库安装和下载的内容网上有很多博客可以借鉴,这里就不进行陈述,不过本人还是建议作为一名开发人员,像数据库这种的还是在linux系统中安装(可以安装在虚拟机中),这样更接近真实的开发,以下内容是鉴于已安装了mongodb数据,并且对mongodb数据库的一些基本知识有一些了解的前提展开。
(CentOS7) Linux环境下的mongodb数据库的安装及配置
正文
1.首先需要搭建项目工程,然后在项目中的pom.xml导入依赖,这里是springboot项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
2.创建application.yml
uri连接的方式:
#spring:
# data:
# mongodb:
# uri: mongodb://用户名:密码@域名:端口/数据库名
3.启动项目,看看控制台是否报错
4.编写实体类,用来与mongo数据库的集合能进行映射
//这里对应mongodb数据库的集合,collection对应集合名称 不写则默认对应集合名,为首字母小写的类名
@Document(collection = "ucm_project_credit_positions")
public class UcmProjectCreditPositionsBO implements Serializable{
//主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
@Id
private String id;
//项目基本信息
/**
* 录入日期
*/
//@Field("")该属性对应mongodb的字段的名字,如果一致,则无需该注解
@Field("oc_date")
private Integer ocDate;
public void parseOcDate(String ocDate) {
this.setOcDate((new BigDecimal(ocDate)).intValue());
}
/**
* 业务部门
*/
@Field("business_unit")
private String businessUnit;
public void parseBusinessUnit(String businessUnit) {
this.setBusinessUnit(businessUnit);
}
/**
* 项目类别
* 编号
*/
@Field("project_type_code")
private String projectTypeCode;
public void parseProjectTypeCode(String projectTypeCode) {
this.setProjectTypeCode(projectTypeCode);
}
/**
* 项目类别
* 名称
*/
@Field("project_type_name")
private String projectTypeName;
public void parseProjectTypeName(String projectTypeName) {
this.setProjectTypeName(projectTypeName);
}
/**
* 项目编号
*/
@Field("project_no")
private String projectNo;
public void parseProjectNo(String projectNo) {
this.setProjectNo(projectNo);
}
/**
* 项目名称
*/
@Field("project_name")
private String projectName;
public void parseProjectName(String projectName) {
this.setProjectName(projectName);
}
/**
* 项目评级
*/
@Field("project_rating")
private String projectRating;
public void parseProjectRating(String projectRating) {
this.setProjectRating(projectRating);
}
/**
* 融资主体
*/
@Field("financier_info")
private List<FinancierBO> financierInfo;
}
5.以上步骤完成,即可用mongotemplate进行操作,注入MongoTemplate
@Service
public class UcmProjectCreditPositionsServiceImpl implements UcmProjectCreditPositionsService {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 根据日期和项目名称查询单个ucm对象
* @param date 系统当前日期
* @param ProjectNo 项目编号
* @return null, 或者符合的 UcmProjectCreditPositionsBO 对象
*/
public UcmProjectCreditPositionsBO getUcmProjectCreditPositionsBoByDateAndProjectNo(Date date, String ProjectNo) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String now = dateFormat.format(date);
Query query = new Query();
query.addCriteria(Criteria.where("project_no").is(ProjectNo));
query.addCriteria(Criteria.where("oc_date").is(Integer.parseInt(now)));
UcmProjectCreditPositionsBO ucm = mongoTemplate.findOne(query, UcmProjectCreditPositionsBO.class, "ucm_project_credit_positions");
return ucm;
}
/**
* 按时间查询多个ucm对象
*
* @param date 系统当前日期
* @return null, List<UcmProjectCreditPositionsBO>
*/
public List<UcmProjectCreditPositionsBO> getUcmProjectCreditPositionsBOListByDate(Date date) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String now = dateFormat.format(date);
Query query = new Query();
query.addCriteria(Criteria.where("oc_date").is(Integer.parseInt(now)));
List<UcmProjectCreditPositionsBO> ucmList = mongoTemplate.find(query, UcmProjectCreditPositionsBO.class, "ucm_project_credit_positions");
return ucmList;
}
}
模糊查询的方式: ^. 开使,* 代表所有, .*$ 结束。
//模糊查询的模式
Pattern pattern = Pattern.compile("^.*" + ucmObj.getProjectName() + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("project_name").regex(pattern));
文档内嵌查询方式:
query.addCriteria(Criteria.where("financier_info.rating").is(rating));
in查询方式,这里 先查询是数据库里已有的数据,再进行删除(批量删除),再插入新数据(批量插入)
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String now = dateFormat.format(new Date());
List<Object> pnoList = pnoCollection(newUcmList);
if (pnoList.get(1) != null) {
Query query = new Query();
//mongo数据量中的日期是int类型,需要进行字符串转整型
query.addCriteria(Criteria.where("oc_date").is(Integer.parseInt(now)));
query.addCriteria(Criteria.where("project_no").in(((List<String>) pnoList.get(0))));
mongoTemplate.remove(query, "ucm_project_credit_positions");
mongoTemplate.insert(((List<UcmProjectCreditPositionsBO>) pnoList.get(1)), "ucm_project_credit_positions");
}
添加文档:可以用 insert 和 save 两种方式添加单条或多条文档 ,它们两的区别就是,save操作,如果要插入的文档与集合中的已有文档的id相同,则会进行更新已有的文档,insert是直接插入,若有id相同则直接报错,由此可见,save可用于多个字段都被需要进行修改的场景。
mongoTemplate.insert(convertUcm, "ucm_project_credit_positions");
mongoTemplate.save(convertUcm, "ucm_project_credit_positions");
值得一提的是,用mongotemplate的查询,映射默认是映射集合中的所有数据(文档),当有符合的查询条件时才筛选出符合查询条件的数据(文档),多个query.addCriteria(XXXX)相当于多条件的并且,内嵌文档可以通过 financier_info.rating这种形式来进行表示,mogotemplate的操作其实也是相对应mongodb命令操作行的形式。其它的复杂查询、组合、聚合,范围等操作,等学会了再记录,以上内容粗浅,先记录避免以后忘记,也顺便给其它新学者提供一个参考。