MongoTemplate 并列条件查询和数组字段追加操作
前言
这里我们使用MongoTemplate来完成并列的and、or 查询和对document里的数组字段的追加操作。
Demo环境
组件 | 版本 |
---|---|
MongoDB | 4.2.10 (db.version()) |
sping-data-mongo | 2.3.5.RELEASE |
java | 11 |
提示:以下是本篇文章正文内容
一、MongoTemplate
MongoTemplate帮助器类,可提高执行常见Mongo操作的效率。包括文档和POJO之间的集成对象映射。
相对于MongoRepository的操作MongoTemplate的操作更多也更灵活。
MongoTemplate可以对collection进行操作;而且通过Query和criteria的结合我们可以以一种比较“面向对象”的方式完成各种查询和更新操作。
一个提醒
MongoDB在使用Template查询的时候注意要查询的字段类型和传参保持一致,如果类型不一致不会抛异常而是查不出结果;这个大家使用的时候要注意。
“123” != 123
然后在写更新语句的时候写入类型要指定
new Date("2020-11-29 04:33:38.000"), "speaker" :new NumberLong( "4891554746090405888")
db.getCollection("DemoCollection").update({ "drId" :new NumberLong(" 4909159988835622912")} , { $push : { "contexts" : { "time" :new Date("2020-11-29 04:33:38.000"), "speaker" :new NumberLong( "4891554746090405888"), "context" : "MongoTemplate 并列条件查询和数组字段追加操作", "_class" : "xxx.xxx.xxx.pojo.po.Context"}}})
其中speaker为Java中的Long型,time为Java中的Date型;
在写入MongoDB的时候也同时要映射到正确的类型。
二、使用步骤
1.引入库
我使用的是Gradle:
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb', version: '2.3.5.RELEASE'
2.连接MongoDB集群
集群还是使用uri连接方式:
spring:
data:
mongodb:
uri: 'mongodb+srv://username:password@cluster0.kquqy.azure.mongodb.net/database?retryWrites=true&w=majority'
username:你的mongodb连接用户名
password:连接密码
database:指定的数据库
cluster0.kquqy.azure.mongodb.net:这一串是你的集群连接url(如果你需要加端口访问那大概就是这样:192.168.100.20:27017
)
该处使用的url已经有了端口映射。
3.1.并列查询
document的pojo
@Data
@Document(collection = "DemoCollection")
public class DialogRecord implements Serializable {
@Id
private Long drId;
private Long from;
private Long to;
private Date beginTime;
private Date endTime;
private List<Context> contexts;
}
同时 and + or 查询
Query query = new Query();
query.addCriteria(new Criteria().andOperator(
Criteria.where("drId").is(dialogRecordId)
.orOperator(
Criteria.where("to").is(userId) ,
Criteria.where("from").is(userId))
)
);
Long matchCount = mongoTemplate.count(query, "DemoCollection");
if (matchCount == 1) {
return "find one");
}
映射的查询语句
db.getCollection("DemoCollection").find({ $and : [{"drId" : 4909159988835622912}, { $or : [{"from" : 4891554746090405888}, {"to" : 4891554746090405888}] }] })
3.2.数组字段的追加操作
Context msg = new Context();
msg.setSpeaker(baseUserInfo.getUserId());
msg.setTime(new Date());
msg.setContext(context);
Query query = new Query();
query.addCriteria(Criteria.where("drId").is(dialogRecordId));
Update update = new Update();
update.push("contexts", msg);
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, "DemoCollection");
if (updateResult.getMatchedCount() == 1) {
if (updateResult.getModifiedCount() >= 1) {
return "追加完成";
}
}
映射的语句
日志:
Calling update using query: { "drId" : 4909159988835622912} and update: { "$push" : { "contexts" : { "time" : { "$date" : "2020-11-29T04:33:38.277Z"}, "speaker" : 4891554746090405888, "context" : "今天午饭吃什么", "_class" : "xxx.xxx.xxx.pojo.po.Context"}}} in collection: DemoCollection
MongoDB语法:
db.getCollection("DemoCollection").update({ "drId" :new NumberLong(" 4909159988835622912")} , { $push : { "contexts" : { "time" :new Date("2020-11-29 04:33:38.000"), "speaker" :new NumberLong( "4891554746090405888"), "context" : "MongoTemplate 并列条件查询和数组字段追加操作", "_class" : "xxx.xxx.xxx.pojo.po.Context"}}})
总结
对于在SpringBoot中集成MongoDB使用下MongoRepository+@Query可以实现对document的大部分的应用场景,然后用MongoTemplate做些其它应用场景的补充。