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类方法
关联查询

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在MongoDB,多关联可以通过MongoTemplate来实现。MongoTemplate是Spring Data MongoDB库提供的一个API,它简化了与MongoDB进行交互的过程。 要在MongoTemplate实现多关联,首先要建立好相关的集合()之间的关系。MongoDB不支持传统的SQL样式的关系型数据库的JOIN操作,但是可以使用一些技巧来实现类似的功能。 一种常见的方法是使用嵌入文档(embedded document)来关联关系。例如,假设有两个集合:`users`和`comments`,每个用户可以有多个评论。可以将评论嵌入到用户文档,如下所示: ```json { "_id": "user1", "name": "John Doe", "comments": [ { "_id": "comment1", "text": "Great post!" }, { "_id": "comment2", "text": "Nice job!" } ] } ``` 在这个例子,`users`集合的每个文档都包含一个`comments`字段,该字段是一个包含评论文档的数组。通过查询`users`集合,可以同时检索到用户和他们的评论。 另一种方法是使用引用(reference)来关联关系。在上面的例子,可以将评论独立存储在`comments`集合,并在用户文档使用评论的ID来引用它们。例如: `users`集合: ```json { "_id": "user1", "name": "John Doe", "comments": ["comment1", "comment2"] } ``` `comments`集合: ```json { "_id": "comment1", "text": "Great post!" } { "_id": "comment2", "text": "Nice job!" } ``` 通过查询`users`集合,然后根据评论的ID查询`comments`集合,可以获取用户和他们的评论。 在MongoTemplate执行这些查询操作可以使用`findOne`或`find`方法,并结合使用`Query`和`Criteria`来指定查询条件。 需要注意的是,MongoDB是一个文档数据库,不支持传统的关系型数据库的复杂的JOIN操作。因此,设计数据模型时需要根据具体的业务需求来选择适当的方法来处理多关联

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值