Boot结合mongodb高阶用法

1. Class(定义类接受mongodb集合实体)

@Document

//@Document(collection="mongodb 对应 collection 名")      
// 若未加 @Document ,该 bean save 到 mongo 的 user collection
// 若添加 @Document ,则 save 到 reUser collection
@Document(collection="reUser") 
public class User{
@Field
给映射存储到 mongodb 的字段取别名
在 java bean 中字段名为 firstName,存储到 mongo 中 key 为 fName
    @Field("fName")
    private String firstName; 

eg:

@Document(collection = "student")//
public class StudentCollectionBean {
    /**
     * 表示student集合的student_id字段
     */
    @Field("student_id")
    private Long studentId;
    /**
     * 表示student集合的学生的name字段
     */
    @Field("name")
    @Indexed(unique = true)
    private String name;
}

2. MongoTemplate

  1. 使用mongoTemplate直接在service里面写操作数据的业务逻辑
   /**
     * 每个操作带上collectionName, 效率提高许多,并且,防止子类错误操作
     *
     * @param formDataApproval 对象
     * @author leimin
     */
public void mongoTemplateSample(FormDataApproval formDataApproval) {
    Query query = new Query(); 
    query.addCriteria(Criteria.where("_id").is(Data.getId()).and("tenant_id").is(Data.getTenantId()));

    Update update = new Update();
    update.set("process_id", formDataApproval.getProcessId());

    List<FormDataApproval> list = new ArrayList<>();
    list.add(formDataApproval);
    /**
     * 修改方法
     */
    mongoTemplate.updateFirst(query, update, FormDataApproval.class, "formDataApproval");
    mongoTemplate.updateMulti(query, update, FormDataApproval.class, "formDataApproval");
      
      //给所有主机更新IsZabbix字段,没有就插入
      Update update = new Update();
      update.set("isZabbix","1");
      mongoTemplate.updateMulti(new Query(),update,"host");

    /**
     * 查询方法
     */
    mongoTemplate.find(query, FormDataApproval.class, "formDataApproval");
    mongoTemplate.findOne(query, FormDataApproval.class, "formDataApproval");
    mongoTemplate.findAll(FormDataApproval.class, "formDataApproval");
    mongoTemplate.findById(formDataApproval.getId(), FormDataApproval.class, "formDataApproval");
    
    /**
     * 查询方法并排序
     */
    Query query4 = new Query(Criteria.where("CustID").ne(null))
    				.with(Sort.by(Sort.Order.desc("CustID")));
        

    /**
     * 删除方法
     */
    mongoTemplate.remove(query, FormDataApproval.class, "formDataApproval");
    mongoTemplate.findAndRemove(query, FormDataApproval.class, "formDataApproval");
    mongoTemplate.findAllAndRemove(query, FormDataApproval.class, "formDataApproval");

    /**
     * 新增方法
     */
    mongoTemplate.save(formDataApproval, "formDataApproval"); // 同upsert(),没有新增,有修改
    mongoTemplate.insert(formDataApproval, "formDataApproval");
    mongoTemplate.insertAll(list);//用集合添加

	/**
	*模糊查询
	*/
	query.addCriteria(Criteria.where("name").regex(Pattern.compile("^.*" + dataBaseType + ".*$", Pattern.CASE_INSENSITIVE)));
    
插入重复数据
	insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 
	异常提示主键重复,不保存当前数据。
	save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。
批操作
	insert: 可以一次性插入一整个列表,而不用进行遍历操作,效率相对较高。
	save: 需要遍历列表,进行一个个的插入

}

2.1 查询

  1. 通过注解注入 mongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
  1. 获取Query 和 Criteria 对象
 Query query = new Query();
 Criteria criteria = new Criteria();
  1. 多参数动态查询。criteria 有两种写法,一种是criteria.and().is();另一种是criteria.where().is(),两种方式不能混合使用,否则不生效。
if(runningStatus != null){
criteria.and("runningStatus").is(runningStatus);
}
  1. 根据日期时间进行范围查询
SimpleDateFormat format =  new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
		
criteria.and("createTime").gt(format.parse(createTime));
criteria.and("endTime").lte(format.parse(endTime));
  1. 模糊查询
Pattern pattern=Pattern.compile("^.*"+taskTypeCode+".*$", Pattern.CASE_INSENSITIVE);
criteria.and("taskTypeCode").regex(pattern);
  1. 将查询条件装载到query中
query.addCriteria(criteria);
  1. 排序 通过参数 sord 判断排序方向,sortBy 为排序字段
 query.with(new Sort(sord.length() == 3 ? Direction.ASC : Direction.DESC, sortBy));
  1. 分页,有两种方式,一种是通过pageable 一种是 limit().skip();limit表示查询多少数据,skip表示从哪条数据查起
//第一种
 query.with(pageable);
 long totoal = this.mongoTemplate.count(query, TaskMongo.class);
 List<TaskMongo> listTaskMongo = this.mongoTemplate.find(query , TaskMongo.class);
 
//第二种
  query.limit(5000).skip(5000);
  List<TaskMongo> listTaskMongo = this.mongoTemplate.find(query , TaskMongo.class);
  1. 一个模糊关键字匹配多个字段
 Pattern pattern=Pattern.compile("^.*"+pattern_name+".*$", Pattern.CASE_INSENSITIVE);
            criatira.orOperator(Criteria.where("name").regex(pattern),
                    Criteria.where("sex").regex(pattern),
                    Criteria.where("age").regex(pattern),
                    Criteria.where("class").regex(pattern));
  1. 查询指定的字段通过 Field这个类,通过findFields.include()方法设置查询字段
Query query = new Query(criteria);
Field findFields = query.fields();
findFields.include("id");

大结局:实战1

//A集合查询条件
Query query = new Query();
query.addCriteria(Criteria.where("B_id").ne(0));
//先显示自己需要字段
query.fields().include("A_id").include("B_id").include("A_ip");

//A集合查询(A表中的A_id,B_id,A_ip,并用map集合接受返回参数类型)
List<Map> aFields = mongoTemplate.find(query, Map.class, "A");

//B集合查询条件
Query bQuery = new Query();
bQuery.addCriteria(Criteria.where("B_id").ne(0));
bQuery.fields().include("B_id").include("B_name");

//查询business集合里面name字段
List<Map> bFields = mongoTemplate.find(bQuery, Map.class, "B");

//使用一个中间变量bName保存A和B的业务名称对应关系
HashMap<Object, Object> bName = new HashMap<>();
for (Map bField : bFields) {
    bName.put(bField.get("B_id"),businessField.get("B_name"));
}

// 更新 A集合的描述字段数据,a=>map,bName=>中间变量bName保存A集合和B集合的业务名称对应关系
aFields.forEach( a->{
     Query query = new Query();
     query.addCriteria(Criteria.where("A_id").is(a.get("A_id")));
     Update update = new Update();
     update.set("Description",a.get("A_ip")+"-"+bName.get(a.get("B_id")));
     mongoTemplate.updateMulti(query,update,"A");
 });

大结局:实战2

//查询条件
Query businessQuery = new Query();
businessQuery.addCriteria(Criteria.where("business_id").ne(0));
businessQuery.fields().include("business_id").include("maintainer");

//查询
List<Map> business = mongoTemplate.find(businessQuery, Map.class, "business");

//批量更新
business.forEach(b->{
	Query query = new Query();
	query.addCriteria(Criteria.where("business_id").is(b.get("business_id")));
	Update update = new Update();
	update.set("OMP",b.get("maintainer"));
	mongoTemplate.updateMulti(query,update,"host");
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值