目录
- 一、前言
- 二、对象、数组等的查询
- 2.1、代码实现示例
- 三、aggregate查询
- 四、U(update)操作
- 4.1、一般的(批量)操作
- 4.2、数组操作
- 五、D(delete)操作
一、前言
一般使用mongodb存储非结构化数据,因此,除了常见的数字类型、String等外,还有数组等复杂格式。查询方式有常见对象/数组等查询、aggregate聚合查询,下面将具体介绍各类查询。
二、对象、数组等的查询
elemMatch操作符用于查询数组中满足特定条件的元素。默认情况下,多条件查询一个数组。文档内的数组一个元素满足所有条件,也可以是每个元素只满足一部分条件但加起来满足所有条件。使用$elemMatch操作符表示要求数组中至少一个元素满足所有条件。
2.1、代码实现示例
/*** 基本的查询,针对各种对象、数据结构类型,find()查询方式* @param param* @return*/public Object baseQuery(KnowledgeVo param){Criteria criteria = new Criteria();criteria.and("tenantsid").is(563651117638208L);//模糊匹配
// Pattern pattern = Pattern.compile("^.*" + param.getKnowledgeName() + ".*$", Pattern.CASE_INSENSITIVE);
// criteria.and("knowledge_name").is(pattern);//范围查询if(StringUtils.isBlank(param.getQueryStartTime()) && StringUtils.isNotBlank(param.getQueryEndTime())){criteria.and("update_time").lte(TimeUtil.parseDatetime(param.getQueryEndTime()));}if(StringUtils.isNotBlank(param.getQueryStartTime()) && StringUtils.isBlank(param.getQueryEndTime())){criteria.and("update_time").gte(TimeUtil.parseDatetime(param.getQueryStartTime()));}if(StringUtils.isNotBlank(param.getQueryStartTime()) && StringUtils.isNotBlank(param.getQueryEndTime())){criteria.and("update_time").gte(TimeUtil.parseDatetime(param.getQueryStartTime())).lte(TimeUtil.parseDatetime(param.getQueryEndTime()));}//String数组的匹配查询// criteria.and("file_info").in(param.getFileInfo());/**"knowledge_customize" : {"is_current_step_skip" : "2","question_basic_info" : [{"project_stage_no" : "1"}]}*///对象的匹配查询【简单格式的】 knowledge_customize是对象,is_current_step_skip是String类型// criteria.and("knowledge_customize.is_current_step_skip").is("2");//特别字段的查询【数组查询】, question_basic_info是knowledge_customize对象的数组字段,project_stage_no又是数组的Bean对象的一个字段// criteria.and("knowledge_customize.question_basic_info.project_stage_no").in("1");//使用elemMatch查询数组criteria.andOperator( Criteria.where("knowledge_customize.question_basic_info").elemMatch(Criteria.where("project_stage_no").is("1")));/**"field_list" : [{"qa_type" : "question","field_name" : "标准答案"},{"qa_type" : "answer","field_name" : "问题描述"}]----针对数组,使用$elemMatch是用来查询*/
// Pattern pattern = Pattern.compile("^.*" + param.getKnowledgeName() + ".*$", Pattern.CASE_INSENSITIVE);
// //模糊匹配,覆盖多个字段去模糊匹配
// criteria.orOperator(
// Criteria.where("template_name").is(pattern),
// Criteria.where("knowledge_model_name").is(pattern),
// Criteria.where("field_list").elemMatch(
// Criteria.where("qa_type").in("answer", "question", "key_point") //数组中,A字段满足某个条件
// .and("field_name").regex(pattern)));Query query = new Query(criteria);List<KnowledgeDoc> docList = mongoTemplate.find(query,KnowledgeDoc.class,"wwy_knowledge");return docList;}
三、aggregate查询
可以参考mongodb集成aggregate查询
四、U(update)操作
4.1、一般的(批量)操作
/*** 修改数据* @return*/
public UpdateResult update(){Query query = new Query();query.addCriteria(Criteria.where("_id").is("0001"));Update update = new Update();update.set("name","www11back");update.set("age",10);update.set("sex",1);UpdateResult result = mongoTemplate.updateFirst(query,update,"w_test1");System.out.println("update result:"+result);//update result:AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}return result;
}/*** 批量更新的操作* @return*/
public int batchUpdate(){List<StudentDo> list = new ArrayList<>(); //要修改的一批数据List<Pair<Query, Update>> updateList = new ArrayList<>(list.size());BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "w_test1");list.forEach(data -> {//如果query查询到有数据就更新Query query = new Query(new Criteria("_id").is(data.getId()));Update update = new Update();update.set("stu_name",data.getStuName());update.set("updateTime",data.getUpdateTime());Pair<Query, Update> updatePair = Pair.of(query, update);updateList.add(updatePair);});operations.upsert(updateList);BulkWriteResult result = operations.execute();return result.getModifiedCount();
}
4.2、数组操作
数组更新操作符(Array Update Operators)
$ 占位符,只更新符合条件的文档的数组字段中的第一个匹配的元素。 下文有demo。
$[] 占位符,和$的区别是更新符合条件的文档的数组字段中的所有元素。
$[<identifier>] 也是占位符,但是只更新符合条件的文档的数组中的指定元素(符合某个条件)。 要和update中的第三个参数中的可选项 arrayFilters配合使用。
$addToSet,添加元素到一个数组,确保不重复(set)。如果数组中没有一模一样的元素,可以插入,如果有,则无法插入。
$pop 删除数组第一个或者最后一个元素。
$pull 删除数组中所有符合指定条件的元素。
$push 添加一个元素到数组中。
$pullAll 删除数组中的所有元素。
五、D(delete)操作
mongoTemplate原生态的delete方法,主要有以下几种。
DeleteResult remove(Object var1);
DeleteResult remove(Object var1, String var2);
DeleteResult remove(Query var1, String var2);
DeleteResult remove(Query var1, Class<?> var2); DeleteResult remove(Query var1, Class<?> var2, String var3);
public Long testDelete() {ContentDoc doc = new ContentDoc ();doc.setId(new ObjectId("6475c519a2ad8619883aa9d8"));// DeleteResult de = mongoTemplate.remove(doc); // DeleteResult remove(Object var1);// DeleteResult de = mongoTemplate.remove(doc,"wwy_content"); // DeleteResult remove(Object var1, String var2);Query query = new Query(Criteria.where("_id").in(new ObjectId("64772716cdea002184353fb1"),new ObjectId("6475d858a2ad8654bc6be713")));
// DeleteResult de = mongoTemplate.remove(query, ContentDoc .class); //DeleteResult remove(Query var1, Class<?> var2);DeleteResult de = mongoTemplate.remove(query, ContentDoc .class,"wwy_content"); // DeleteResult remove(Query var1, Class<?> var2, String var3);// DeleteResult de = mongoTemplate.remove(query, "wwy_content"); // DeleteResult remove(Query var1, String var2);System.out.println("de:"+de.getDeletedCount()); //de:AcknowledgedDeleteResult{deletedCount=1}return de.getDeletedCount();}