配置
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
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