MongoTemplate 并列条件查询和数组字段追加操作


前言

这里我们使用MongoTemplate来完成并列的and、or 查询和对document里的数组字段的追加操作。


Demo环境

组件版本
MongoDB4.2.10 (db.version())
sping-data-mongo2.3.5.RELEASE
java11

提示:以下是本篇文章正文内容

一、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做些其它应用场景的补充。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值