Mongodb使用總結

  • 2022 年 8 月 21 日
  • 筆記

Mongodb使用總結

  • 基於記憶體操作,便於與網站交互
  • 資料庫-集合-文檔(存儲多種數據類型),我們的操作都是基於單文檔進行操作,並且通過冗餘欄位進行操作
  • 嵌入式數組文檔減少了對昂貴連接的需求
    • DoucmentArray:[子文檔(動態)]

操作

都是基於文檔操作

@Document("wf_process")
@Data
@NoArgsConstructor
@FieldNameConstants
public class ProcessDefinition implements SynchronizerSign {
    /**
     * 流程ID
     */
    @Id  //與資料庫_id映射,@Document("wf_process")
    @Indexed(unique = true)索引3
    @JsonSerialize(using = ToStringSerializer.class) 精度丟失
    private Long procId;

文檔

//增加文檔
ProcessDefinition resProcess = mongoTemplate.insert(wfProcess);

//改
Query query = new Query();
Update update = new Update();
Criteria criteriaOne = Criteria.where(ProcessDefinition.Fields.procId).is(processVo.getProcId());//找到文檔
update.set(ProcessDefinition.Fields.procName, procName);//修改的屬性
mongoTemplate.updateMulti(query,update,ProcessDefinition.class);//批量修改

//查詢
ProcessDefinition wfProcess = mongoTemplate.findOne(query, ProcessDefinition.class);//find查詢滿足條件的文檔集合

//刪除 邏輯刪除 update     物理刪除	remove
//query.fields進行欄位過濾

文檔數組

 Query query = new Query();
 Update update = new Update();
            query.addCriteria(Criteria.where(ProcessDefinition.Fields.procId).is(pub.getProcId()));//找到文檔

//添加元素到數組  addToSet去重
update.addToSet(ProcessDefinition.Fields.flowNodes,pub);
             mongoTemplate.upsert(query,update,ProcessDefinition.class);//upsert 找不到文檔時會自動創建文檔
//不去重效率高
update.push("likes").each(objects);

//更新數組元素
Criteria.where(ProcessDefinition.Fields.flowNodes).
                 elemMatch(Criteria.where(PublicFlowNode.Fields.nodeId).is(pub.getNodeId())));//elemMatch找到數組元素  flowNodes.nodeID = nodeID
update.set("flowNodes.$",pub);//$獲取到的元素

        query.addCriteria(Criteria.where(ProcessInstanceData.Fields.dataId)
                .is(dataId)
                .and("instanceData.flowNodeId")
                .is(deleteId));



                mongoTemplate.updateFirst(query,update,ProcessDefinition.class);

//更新數組元素某個屬性
update.set("flowNodes.$.nextId", nodeId);


//獲取數組中的元素
query.fields().elemMatch(ProcessInstanceData.Fields.instanceData,
                Criteria.where(InstanceData.Fields.flowNodeId).
                        is(nodeId));//fields()過濾欄位
        ProcessInstanceData processInstanceData = mongoTemplate.findOne(query, ProcessInstanceData.class);
List<InstanceData> instanceDatas = processInstanceData.getInstanceData();
instanceDatas.get(0);

//獲取數組中的指定幾個元素
//封裝對象列表查詢條件
        List<AggregationOperation> commonOperations = new ArrayList<>();
        //1. 指定查詢主文檔
        MatchOperation match = Aggregation.match(Criteria.where(ProcessInstanceData.Fields.dataId).
                is(dataId));
        commonOperations.add(match);
        //2. 指定投影,返回哪些欄位
        ProjectionOperation project = Aggregation.project(ProcessInstanceData.Fields.instanceData);
        commonOperations.add(project);
        //3. 拆分內嵌文檔,  可以查詢需要的記錄
        UnwindOperation unwind = Aggregation.unwind(ProcessInstanceData.Fields.instanceData);
        commonOperations.add(unwind);
        //4. 指定查詢  指定幾個數組元素
        MatchOperation match2 = Aggregation.match(
                Criteria.where("instanceData.flowNodeId").in(nodeIds));
        commonOperations.add(match2);

        //5.創建管道查詢對象
        Aggregation aggregation = Aggregation.newAggregation(commonOperations);
        AggregationResults<JSONObject> aggregate = mongoTemplate
                .aggregate(aggregation, ProcessInstanceData.class, JSONObject.class);
//刪除數組元素
instanceData = 刪除的對象
update.pull(ProcessInstanceData.Fields.instanceData,instanceData);
Tags: