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
- 使用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 查询
- 通过注解注入 mongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
- 获取Query 和 Criteria 对象
Query query = new Query();
Criteria criteria = new Criteria();
- 多参数动态查询。criteria 有两种写法,一种是criteria.and().is();另一种是criteria.where().is(),两种方式不能混合使用,否则不生效。
if(runningStatus != null){
criteria.and("runningStatus").is(runningStatus);
}
- 根据日期时间进行范围查询
SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
criteria.and("createTime").gt(format.parse(createTime));
criteria.and("endTime").lte(format.parse(endTime));
- 模糊查询
Pattern pattern=Pattern.compile("^.*"+taskTypeCode+".*$", Pattern.CASE_INSENSITIVE);
criteria.and("taskTypeCode").regex(pattern);
- 将查询条件装载到query中
query.addCriteria(criteria);
- 排序 通过参数 sord 判断排序方向,sortBy 为排序字段
query.with(new Sort(sord.length() == 3 ? Direction.ASC : Direction.DESC, sortBy));
- 分页,有两种方式,一种是通过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);
- 一个模糊关键字匹配多个字段
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));
- 查询指定的字段通过 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");
});