化身天使的博客

7.spring mongo

配置

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";
}

posted @ 2024-01-25 19:50  化身天使  阅读(51)  评论(0)    收藏  举报