Mongodb使用总结

莱莱  金牌会员 | 2022-9-16 17:18:30 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 676|帖子 676|积分 2028

Mongodb使用总结


  • 基于内存操作,便于与网站交互
  • 数据库-集合-文档(存储多种数据类型),我们的操作都是基于单文档进行操作,并且通过冗余字段进行操作
  • 嵌入式数组文档减少了对昂贵连接的需求

    • DoucmentArray:[子文档(动态)]

操作

都是基于文档操作
  1. @Document("wf_process")
  2. @Data
  3. @NoArgsConstructor
  4. @FieldNameConstants
  5. public class ProcessDefinition implements SynchronizerSign {
  6.     /**
  7.      * 流程ID
  8.      */
  9.     @Id  //与数据库_id映射,@Document("wf_process")
  10.     @Indexed(unique = true)索引3
  11.     @JsonSerialize(using = ToStringSerializer.class) 精度丢失
  12.     private Long procId;
复制代码
文档
  1. //增加文档
  2. ProcessDefinition resProcess = mongoTemplate.insert(wfProcess);
  3. //改
  4. Query query = new Query();
  5. Update update = new Update();
  6. Criteria criteriaOne = Criteria.where(ProcessDefinition.Fields.procId).is(processVo.getProcId());//找到文档
  7. update.set(ProcessDefinition.Fields.procName, procName);//修改的属性
  8. mongoTemplate.updateMulti(query,update,ProcessDefinition.class);//批量修改
  9. //查询
  10. ProcessDefinition wfProcess = mongoTemplate.findOne(query, ProcessDefinition.class);//find查询满足条件的文档集合
  11. //删除 逻辑删除 update     物理删除        remove
  12. //query.fields进行字段过滤
复制代码
文档数组
  1. Query query = new Query();
  2. Update update = new Update();
  3.             query.addCriteria(Criteria.where(ProcessDefinition.Fields.procId).is(pub.getProcId()));//找到文档
  4. //添加元素到数组  addToSet去重
  5. update.addToSet(ProcessDefinition.Fields.flowNodes,pub);
  6.              mongoTemplate.upsert(query,update,ProcessDefinition.class);//upsert 找不到文档时会自动创建文档
  7. //不去重效率高
  8. update.push("likes").each(objects);
  9. //更新数组元素
  10. Criteria.where(ProcessDefinition.Fields.flowNodes).
  11.                  elemMatch(Criteria.where(PublicFlowNode.Fields.nodeId).is(pub.getNodeId())));//elemMatch找到数组元素  flowNodes.nodeID = nodeID
  12. update.set("flowNodes.$",pub);//$获取到的元素
  13.         query.addCriteria(Criteria.where(ProcessInstanceData.Fields.dataId)
  14.                 .is(dataId)
  15.                 .and("instanceData.flowNodeId")
  16.                 .is(deleteId));
  17.                 mongoTemplate.updateFirst(query,update,ProcessDefinition.class);
  18. //更新数组元素某个属性
  19. update.set("flowNodes.$.nextId", nodeId);
  20. //获取数组中的元素
  21. query.fields().elemMatch(ProcessInstanceData.Fields.instanceData,
  22.                 Criteria.where(InstanceData.Fields.flowNodeId).
  23.                         is(nodeId));//fields()过滤字段
  24.         ProcessInstanceData processInstanceData = mongoTemplate.findOne(query, ProcessInstanceData.class);
  25. List<InstanceData> instanceDatas = processInstanceData.getInstanceData();
  26. instanceDatas.get(0);
  27. //获取数组中的指定几个元素
  28. //封装对象列表查询条件
  29.         List<AggregationOperation> commonOperations = new ArrayList<>();
  30.         //1. 指定查询主文档
  31.         MatchOperation match = Aggregation.match(Criteria.where(ProcessInstanceData.Fields.dataId).
  32.                 is(dataId));
  33.         commonOperations.add(match);
  34.         //2. 指定投影,返回哪些字段
  35.         ProjectionOperation project = Aggregation.project(ProcessInstanceData.Fields.instanceData);
  36.         commonOperations.add(project);
  37.         //3. 拆分内嵌文档,  可以查询需要的记录
  38.         UnwindOperation unwind = Aggregation.unwind(ProcessInstanceData.Fields.instanceData);
  39.         commonOperations.add(unwind);
  40.         //4. 指定查询  指定几个数组元素
  41.         MatchOperation match2 = Aggregation.match(
  42.                 Criteria.where("instanceData.flowNodeId").in(nodeIds));
  43.         commonOperations.add(match2);
  44.         //5.创建管道查询对象
  45.         Aggregation aggregation = Aggregation.newAggregation(commonOperations);
  46.         AggregationResults<JSONObject> aggregate = mongoTemplate
  47.                 .aggregate(aggregation, ProcessInstanceData.class, JSONObject.class);
  48. //删除数组元素
  49. instanceData = 删除的对象
  50. update.pull(ProcessInstanceData.Fields.instanceData,instanceData);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表