【MongoDB】--MongoDB的crud操作

目录

  • 一、前言
  • 二、对象、数组等的查询
    • 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();
    }

你可能感兴趣的:(mongodb,mongodb)