首页 > 其他分享 >7.spring mongo

7.spring mongo

时间:2024-01-25 19:55:06浏览次数:29  
标签:mongo spring new Criteria import Query id String

配置

MongoRepository

可以根据实体中的字段,自己进行组合查询,
创建一个继承MongoRepository的接口,在该接口中定义方法

示例

实体类

import lombok.Getter;
import lombok.Setter;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Date;
import java.util.Map;
@Setter
@Getter
@Document(collection="集合实际名字" )
public class Coll1 {
    @Id           //id注解
    @Field("_id") //id实际名字
    private ObjectId id;   //id类型

    @Field("update_time")  //实际名字
    private Date updateTime;

    private Map property;

    @Field("property.id_act")
    private String idAct;

    @Field("property.update_date")
    private String updateDate;

    @Field("property.baitan_status")
    private String baitanStatus;

    @Override
    public String toString() {   //toString需要重写
        return "Coll1{" +
                "id=" + id +
                ", updateTime=" + updateTime +
                ", property=" + property +
                '}';
    }
}

DAO层(mapper)

import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.Date;

//参数 <实体类名,主键类型>
//Repository 注意注解
@Repository
public interface Coll1Repo extends MongoRepository<Coll1, ObjectId> {
    //根据已有字段组合查询
    //Coll1 findById(ObjectId id);  //已存在的方法会报错
    Coll1 findByidAct(String idAct);
    

    @Query(value = "{idAct:?0,updateDate:?1,baitanStatus:"已闭摊"}",fields = "{'property':1,'id':0}")
    BaitanBusivolume findByActDate(String act,String date);
}

自组合查询

自定义查询

使用@Query注解, 字段必须是定义过的字段

value:查询条件 value="{}"
      花括号内字段名不用加引号,单双引号都需要转义
fields:要返回的字段
```
@Query(value = "{idAct:?0,updateDate:?1,baitanStatus:"已闭摊"}",fields = "{'property':1,'id':0}")
BaitanBusivolume findByActDate(String act,String date);
```

服务层

调用

新增

        BaitanNodePlan baitanNodePlan = new BaitanNodePlan();
        baitanNodePlan.setUpdateTime(new Date());
        baitanNodePlan.setProperty(new HashMap(){{
            put("id_act","abc");
            put("状态","");
            put("创建人","五里亭");
            put("计划日期","2022-11-21");
        }});
        baitanNodeService.save(baitanNodePlan);

MongoTemplate

实体类可用上面的,其他的自己看着写

查询

标识符
find 获取全部符合条件的
findOne 获取一条符合条件的
findAll(Coll1.class) 获取整张表
List<Coll1> allList=monTemplate.findAll(Coll1.class);

findBy..   自己组合字段及条件
``Coll1 oneBaitan=monTemplate.findById(new ObjectId("658e4dc9b32bbeb470000000"), Coll1.class);``

Criteria查询 条件

条件字段必须是实体类里定义过的, 
规则 .where(字段).选项(值).and(字段).选项(值)
第一个字段用where,后面的字段用and

示例

```
Criteria criteria = Criteria.where("idAct").is("act").and("updateTime").lt(new Date());  //构造条件
Query query= new Query(criteria);   //创建查询对象
Coll1 baitanFindOne= monTemplate.findOne(query, Coll1.class);
```

选项

.is("abc")   //内容等于
.exists(true)   //获取字段存在的

条件组合and or nor

操作符

andOperator
orOperator
norOperator
        //创建三个条件,
        Criteria criteriaSex = Criteria.where("sex").is(1);
        Criteria criteriaAge = Criteria.where("age").is(2);
        Criteria criteria3 = Criteria.where("age").is(3);
        //将上面条件组合起来
        Criteria criteria1 = new Criteria().andOperator(criteriaAge,criteriaSex,criteria3);

Query 查询选项

Query(criteria).with(Sort.by("_id")).skip(50).limit(10)

.with(Sort.by("_id"))  //按_id排序
.with(Sort.by("_id").ascending())  //升序
.skip(50) //跳过
.limit(10) //限制结果数

新增

```
    String collectionName="coll1";
    BaitanNodePlan bai3 = new BaitanNodePlan();
    bai3.setUpdateTime(new Date());
    bai3.setProperty(new HashMap(){{
        put("id_act", "abc");
        put("状态", "");
    }});
```        

save

ObjectId不存在插入,存在更新,同一个上下文中多次传入同一组数据调用算存在
(文档实例,字符串集合名)

`monTemplate.save(bai3, collectionName);`

insert

ObjectId不存在插入,存在报错,同一个上下文中多次传入同一组数据调用算存在
(文档实例,字符串集合名)

`monTemplate.insert(bai3,collectionName);`

批量新增insert

传入list,其他同insert

```
monTemplate.insert(List list, coll1.class);
```

修改

upsert
存在更新,不存在插入

        //创建查询条件 及查询对象
        Criteria criteria2 = Criteria.where("idAct").is("gzt_20231127_65645212a0ce6");
        Query query2 = new Query(criteria2);
        // 创建更新对象及更新的内容,必须是已定义过的字段
       Update update = new Update().set("update_tmie", new Date());
        UpdateResult result = monTemplate.upsert(query2, update, BaitanNodePlan.class);

        log.info(" 匹配数:{},修改数:{},新增项id:{},toString:{}",result.getMatchedCount(),result.getModifiedCount(),result.getUpsertedId(),result.toString());

批量修改
public String handle(List dataList){
if(dataListnull || dataList.size()0){
return "无数据";
}
List<Pair<Query, Update>> baitanList=new ArrayList<>();
int n=0;
//批量插入设置
BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, BaitanNodePlan.class);

    for (BaitanBusivolume bdata:dataList){
        Map<String,Object> property =(HashMap<String,Object>) bdata.getProperty();
        Map<String,Integer> data =(Map) property.get("data");
        int kd=data.get("宽带受理量");
        int fh=data.get("放号量(手机用户)");
        String idAct=(String) property.get("id_act");
        if(kd+fh>=3){
            // 批量插入相关
            Query query = new Query(Criteria.where("idAct").is(idAct));
            Update update= new Update();
            update.set("status", "有效");
            baitanList.add(Pair.of(query,update));

            n++;
            if (n==3000){
                //批量插入提交
                ops.updateOne(baitanList).execute();
                baitanList.clear();
                n=0;
                log.info("commit");
            }
        }
    }
    if(baitanList.size()>0){
        //提交
        ops.updateOne(baitanList).execute();
        baitanList.clear();
        n=0;
        log.info("commit");
    }
    log.info("修改摆摊状态定时任务执行完毕");
    return "ok";
}

标签:mongo,spring,new,Criteria,import,Query,id,String
From: https://www.cnblogs.com/wakevol/p/17929745.html

相关文章

  • spring boot lombok插件
    Lombok集成首先我们需要在IDEA中安装好Lombok插件,如果你使用的是最新版IDEA2020.3,则Lombok插件已经内置,无需安装。 之后在项目的pom.xml文件中添加Lombok依赖,SpringBoot2.1.x版本后无需指定Lombok版本,SpringBoot在spring-boot-dependencies中已经内置。<!--lombok依赖--><......
  • Spring的事务使用教程
    什么是事务?事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败。事务四个特性(ACID)原子性一组操作要么都成功,要么都失败。一致性一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。隔离性事务1......
  • SpringBoot:Springboot整合Mqtt并处理问题
    搭建mqtt服务Docker搭建MQTT服务:https://www.cnblogs.com/nhdlb/p/17960641项目结构这是我的项目结构,主要有两个模块base-modules(业务模块)、base-utils(工具模块)组成,其中base-mqtt服务为工具模块,用于提供给其他业务模块引用依赖的。base-mqtt模块pom.xml这里我的Sprin......
  • mongodb表索引备份,索引的导出导入
    mongodb表索引备份,索引的导出导入背景发现有两个mongodb环境的数据库表索引不一致,另一个数据库有索引缺失,需要将一个数据库里的所有表索引导入到另一个数据库也可用于单独备份数据库所有表的索引写mongoshell的js脚本可参考官方文档https://docs.mongodb.com/manual/tutor......
  • springBoot自定义参数注解
    springBoot自定义参数注解前置条件:新建一个springboot项目1.新建一个标记注解@Authimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***@authorwa......
  • 解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
    跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-OriginPolicy),即只允许页面请求同源(相同协议、域名和端口)的资源,当JavaScript发起的请求跨越了同源策略,即请求的目标与当前页面的域名、端口、协议不一致时,浏览器会阻止请求的发送或接收。解决跨域问题方案跨域问题......
  • 「Java开发指南」MyEclipse如何支持Spring Scaffolding?(二)
    在上文中(点击这里回顾>>),主要为大家介绍了使用Spring的Scaffolding应用程序,本文将继续讲解CRUDScaffolding。MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论2.CRUDScaffoldingScaffolding指的是MyEclipse广泛代码生成功能的超集,从生成一组特......
  • Springboot整合logback
    Springboot整合logback1、引入maven依赖<!--slf4j日志门面--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.26</version>&......
  • Spring的JdbcTemplate使用教程
    什么是JdbcTemplate?Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作。准备工作引入jdbcTemplate的相关依赖:案例实操创建jdbc.properties文件,配置数据库信息jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/dbtest1?serv......
  • mongo-exporter获取mongo指标数据
    mongo-exporter获取mongo指标数据测试1.Docker部署mongo#创建保存mongo数据与mogo配置文件目录mkdir/home/wjy/{data,etc}#进入/home/wjy/etc编写默认的配置文件(容器内拷贝出来、百度、下载安装程序)#默认未创建用户前不开启security#dockerrun启动单实例的mong......