化身天使的博客

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  化身天使  阅读(38)  评论(0)    收藏  举报