MongoTemplate学习记录(解决关联查询中从表条件无效问题)

MongoTemplate常用类

Query

//查询类
Query query = new Query(Criteria criteria)

Criteria

//常用方法
//正常查询
Criteria.where("列名").is(具体数据)
//查询同时包含values中的数据
Criteria.where("列名").all(具体数据)
//and的使用方法
Criteria.where("列名").is(具体数据)
                .and("列名").is(具体数据)
//查询包含values中的数据
Criteria.where("列名").in(具体数据)
//模糊查询
Criteria.where("列名").regex("正则表达式")
//同一个字段的多个约束,注意andOperator中是一个列
where("列名").is(具体数据)
.andOperator(
Criteria.where("列名1").lt(具体数据),
Criteria.where("列名1").gte(具体数据)))
//单独使用<,>
Criteria.where("列名").gte(具体数据)
//查询某个字段不存在的数据
Criteria.where("列名").not()
//查询字段不为空的数据
Criteria.where("列名").ne("").ne(null) 
//使用or/and
criteria.or/andOperator(Criteria.where("列名1").is(具体数据),Criteria.where("列名2").is(具体数据))

Update

//把"key1"对应的值设置为"value1",如果数据中不存在"key1",则会新增加一条信息key1:value1
update.set("key1", "value1") 
//inc累加计算,即sum在原来基础上加上100,相当于sum=sum+100
update.inc("sum", 100) 
//乘法计算,即sum在原来基础上乘以100,相当于sum=sum*100
update.multiply("sum", 100)	
//rename用于修改键值, 即把"key2":"value2"修改为"k2":"value2"
update.rename("key2", "k2")	
//删除键为"key3"的信息,即从文档中移除该键
update.unset("key3")	
//删除array数组中的"a1"。 例如"array":["a1","a2","a3"],删除"a1"后的结果 "array":["a2","a3"]
update.pull("array", "a1")	
//可一次性删除数组内多个值
update.pullAll("array", Object[] values)	
//向array数组里添加"a3"(不会检查数组中元素是否重复), 数组"array"不存在则会新建该数组。修改后结果"array":["a2","a3","a3"]
update.push("array","a3")	
//可一次性向数组内添加多个值
update.pushAll("array", Object[] values)
//向array数组里添加"a3"(会检查数组中元素是否重复), 数组"array"不存在则会新建该数组。修改后结果"array":["a2","a3"]
update.addToSet("array","a3")	
//从"array"数组 开头/结尾(Update.Position.FIRST/Update.Position.LAST) 移除一个元素
update.pop("array",Update.Position.FIRST)	
//更新符合query条件的第一条数据
template.updateFirst(query, update, collectionName); 
//更新符合query条件的所有数据
template.updateMulti(query, update, collectionName);
//更新符合条件时如果不存在则会新增加一条数据,相当于执行了insert()方法
template. upsert(query, update, collectionName); 

MongoTemplate基本CRUD

新增

//新增一条
mongoTemplate.save(要存储在集合中的对象,集合名);
//批量新增
mongoTemplate.insert(要存储在集合中的对象列表, 集合名)

查询

//查询多个
mongoTemplate.find(Query查询类对象, 返回值(集合), 集合名)
//查询一个
mongoTemplate.findOne(Query查询类对象, 返回值(对象),集合名)

修改

//修改查询到的第一个
mongoTemplate.updateFirst(Query查询类对象(需要修改哪个对象), Update类对象(需要更新的对象信息), 要操作的实体类, 集合名)
//修改查询到的所有
mongoTemplate.updateMulti(Query查询类对象(需要修改哪个对象), Update类对象(需要更新的对象信息), 要操作的实体类, 集合名)

删除

//删除全部(删除一般都不用)
mongoTemplate.remove(Query查询类对象, 集合名)

关联查询

LookupOperation lookupToLots = LookupOperation.newLookup().
            from("eCostRecord").//关联表名 lots
            localField("lsumpDocNumber").//关联字段
            foreignField("lsumpDocNumber").//主表关联字段对应的次表字段
            as("groups");//查询结果集合名    
//主表
Criteria ordercri = Criteria.where("eccDocNo").ne(null).ne("");
AggregationOperation match = Aggregation.match(ordercri);
//次表
Criteria ordercri1 = Criteria.where("group").is(true);
AggregationOperation match1 = Aggregation.match(ordercri);
 
//UnwindOperation unwind = Aggregation.unwind("groups");
Aggregation aggregation = Aggregation.newAggregation(match,  lookupToLots,match1//, unwind);
 
return mongoTemplate.aggregate(aggregation, "reClassGroup", ReClassGroup.class).getMappedResults();

从表条件一定要放在lookupToLots 后面才能生效,这是因为as(“groups”)语句类似于sql中的取别名,而从表中使用啦别名,声明要在使用的前面,至于很多博主说必须写“UnwindOperation unwind = Aggregation.unwind(“groups”)”从表条件才能生效,个人验证无效

子查询

//一个简单的例子
Query query1 = new Query(Criteria.where("_id").is(1));
User users = mongoTemplate.findOne(query1, User.class, "users");
Object address = null;
if(users != null){
      Query query = new Query(Criteria.where("_id").is(users.id));
      address= mongoTemplate.findOne(query, Object.class, "addresses");
      			}

参考:
Update类方法
关联查询

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值