SpringBoot高级篇MongoDB之如何新增文档

news/2025/2/8 19:11:23

本篇博文为mongodb的curd中一篇,前面介绍简单的查询使用,这一篇重点则放在插入数据;

I. 基本使用

首先是准备好基本环境,可以参考博文

  • 181213-SpringBoot高级篇MongoDB之基本环境搭建与使用
  • 190113-SpringBoot高级篇MongoDB之查询基本使用姿势

1. 新增一条数据

MongoDB一个基本数据称为document,和mysql不一样,没有强制约束哪些字段,可以随意的插入,下面是一个简单的插入演示

private static final String COLLECTION_NAME = "demo";

@Autowired
private MongoTemplate mongoTemplate;

/**
 * 新增一条记录
 */
public void insert() {
    JSONObject object = new JSONObject();
    object.put("name", "一灰灰blog");
    object.put("desc", "欢迎关注一灰灰Blog");
    object.put("age", 28);

    // 插入一条document
    mongoTemplate.insert(object, COLLECTION_NAME);


    JSONObject ans = mongoTemplate
            .findOne(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(28)), JSONObject.class,
                    COLLECTION_NAME);
    System.out.println(ans);
}

使用的关键地方为一行: mongoTemplate.insert(object, COLLECTION_NAME);

  • 第一个参数为待插入的document
  • 第二个参数为collection name (相当于mysql的table)

执行后输出结果为如下

{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":28,"desc":"欢迎关注一灰灰Blog"}

2. 批量插入

一次插入多条记录,传集合进去即可

/**
 * 批量插入
 */
public void insertMany() {
    List<Map<String, Object>> records = new ArrayList<>();
    for (int i = 0; i < 3; i++) {
        Map<String, Object> record = new HashMap<>(4);
        record.put("wechart", "一灰灰blog");
        record.put("blog", Arrays.asList("http://spring.hhui.top", "http://blog.hhui.top"));
        record.put("nums", 210);
        record.put("t_id", i);
        records.add(record);
    }

    // 批量插入文档
    mongoTemplate.insert(records, COLLECTION_NAME);

    // 查询插入的内容
    List<Map> result =
            mongoTemplate.find(new Query(Criteria.where("wechart").is("一灰灰blog")), Map.class, COLLECTION_NAME);
    System.out.println("Query Insert Records: " + result);
}

返回结果如下:

Query Insert Records: [{t_id=0, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5022, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}, {t_id=1, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5023, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}, {t_id=2, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5024, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}]

3. upsert,不存在才插入

我们希望在插入之前,判断数据是否存在,如果不存在则插入;如果存在则更新;此时就可以采用upsert来使用,一般三个参数

mongoTemplate.upsert(Query query, Update update, String collectionName)

第一个为查询条件,第二个为需要更新的字段,最后一个指定对应的collection,一个简单的实例如下

/**
 * 数据不存在,通过 upsert 新插入一条数据
 *
 * set 表示修改key对应的value
 * addToSet 表示在数组中新增一条
 */
public void upsertNoMatch() {
    // addToSet 表示将数据塞入document的一个数组成员中
    UpdateResult upResult = mongoTemplate.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(100)),
            new Update().set("age", 120).addToSet("add", "额外增加"), COLLECTION_NAME);
    System.out.println("nomatch upsert return: " + upResult);

    List<JSONObject> re = mongoTemplate
            .find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)), JSONObject.class,
                    COLLECTION_NAME);
    System.out.println("after upsert return should not be null: " + re);
    System.out.println("------------------------------------------");
}

输出结果如下:

nomatch upsert return: AcknowledgedUpdateResult{matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{value=5c49b07ce6652f7e1add1ea2}}
after upsert return should not be null: [{"add":["额外增加"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":120}]
------------------------------------------

4. upsert,存在则更新

前面的demo是演示不存在,那么存在数据呢?

/**
 * 只有一条数据匹配,upsert 即表示更新
 */
public void upsertOneMatch() {
    // 数据存在,使用更新
    UpdateResult result = mongoTemplate.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)),
            new Update().set("age", 100), COLLECTION_NAME);
    System.out.println("one match upsert return: " + result);

    List<JSONObject> ans = mongoTemplate
            .find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(100)), JSONObject.class,
                    COLLECTION_NAME);
    System.out.println("after update return should be one: " + ans);
    System.out.println("------------------------------------------");
}

输出结果如下,注意下面的输出数据的 _id,正视前面插入的那条数据,两个数据唯一的不同,就是age被修改了

one match upsert return: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
after update return should be null: [{"add":["额外增加"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":100}]

5. upsert,多条满足时

如果query条件命中多条数据,怎么办?会修改几条数据呢?

/**
 * 两条数据匹配时,upsert 将只会更新一条数据
 */
public void upsertTwoMatch() {
    // 多条数据满足条件时,只会修改一条数据
    System.out.println("------------------------------------------");
    List<JSONObject> re = mongoTemplate
            .find(new Query(Criteria.where("name").is("一灰灰blog").and("age").in(Arrays.asList(28, 100))),
                    JSONObject.class, COLLECTION_NAME);
    System.out.println("original record: " + re);

    UpdateResult result = mongoTemplate
            .upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").in(Arrays.asList(28, 100))),
                    new Update().set("age", 120), COLLECTION_NAME);
    System.out.println("two match upsert return: " + result);

    re = mongoTemplate.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)), JSONObject.class,
            COLLECTION_NAME);
    System.out.println("after upsert return size should be 1: " + re);
    System.out.println("------------------------------------------");
}

根据实际输出进行查看,发现只有一条数据被修改;另外一条保持不变,结果如下

------------------------------------------
original record: [{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":28,"desc":"欢迎关注一灰灰Blog"}, {"add":["额外增加"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":100}]
two match upsert return: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
after upsert return size should be 1: [{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":120,"desc":"欢迎关注一灰灰Blog"}]
------------------------------------------

II. 其他

0. 项目

  • 工程:spring-boot-demo
  • module: mongo-template

相关博文

  • 181213-SpringBoot高级篇MongoDB之基本环境搭建与使用
  • 190113-SpringBoot高级篇MongoDB之查询基本使用姿势

1. 一灰灰Blog

  • 一灰灰Blog个人博客 https://blog.hhui.top
  • 一灰灰Blog-Spring专题博客 http://spring.hhui.top

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog
  • QQ: 一灰灰/3302797840

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals


http://www.niftyadmin.cn/n/4231752.html

相关文章

应用的代码没有用新的类库来进行编译(转)

一个一直运行正常的应用突然无法运行了。在类库被更新之后&#xff0c;返回下面的错误。 Exception in thread "main" java.lang.NoSuchMethodError: com.nhn.user.UserAdmin.addUser(Ljava/lang/String;)V at com.nhn.service.UserService.add(UserService.jav…

【原创】SQLServer将数据导出为SQL脚本的方法

最近很多同学问到一个问题&#xff0c;如何将MSSQLServer的数据库以及里面的数据导出为SQL脚本&#xff0c;主要问的是MSSQLServer2000和2005&#xff0c;因为2008的管理器已经有了这个功能&#xff0c;2000和2005则没有。 上网查了一下&#xff0c;有用命令什么的&#xff0c;…

SpringBoot基础篇AOP之基本使用姿势小结

原文&#xff1a;190301-SpringBoot基础篇AOP之基本使用姿势小结 一般来讲&#xff0c;谈到Spring的特性&#xff0c;绕不过去的就是DI&#xff08;依赖注入&#xff09;和AOP&#xff08;切面&#xff09;&#xff0c;在将bean的系列中&#xff0c;说了DI的多种使用姿势&#…

传球游戏

描述 上体育课的时候&#xff0c;小蛮的老师经常带着同学们一起做游戏。这次&#xff0c;老师带着同学们一起做传球游戏。 游戏规则是这样的&#xff1a;n个同学站成一个圆圈&#xff0c;其中的一个同学手里拿着一个球&#xff0c;当老师吹哨子时开始传球&#xff0c;每个同学可…

Android性能优化典范第一季

2015年伊始&#xff0c;Google发布了关于Android性能优化典范的专题&#xff0c;一共16个短视频&#xff0c;每个3-5分钟&#xff0c;帮助开发者创建更快更优秀的Android App。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理&#xff0c;同时也介绍了如何通过工…

Mysql DDL出现长时间等待MDL问题分析

给表新增字段时&#xff0c;发现锁表了&#xff0c;查看进程&#xff0c;提示Waiting for table metadata lock&#xff0c;等待锁释放&#xff1b;然而蛋疼的是几分钟过去了&#xff0c;依然没有任何的进展&#xff0c;特此记录下这个问题的定位过程以及MDL的相关背景知识 看…

高仿美团应用客户端项目源码

源码Tuan&#xff0c;这个案例是模仿MJ老师ipad版美团&#xff08;swift版&#xff09;&#xff0c;高仿美团iOS版&#xff0c;版本号&#xff1a;5.7&#xff0c; 已更新到Swift 2.0 基于Xcode 7&#xff1a;http://code.662p.com/view/11383.html<ignore_js_op> <ig…

Oracle 分析表

2019独角兽企业重金招聘Python工程师标准>>> 当select num_rows from user_tables 和 select count(*) from table不一样时&#xff0c;需要对表进行分析&#xff0c; 具体如下&#xff1a; analyze table tablename compute statistics&#xff1b; 转载于:https:/…