Spring Data MongoDB--MongoTemplate修改数据--方法/实例

本文通过实例演示了如何使用Spring Data MongoDB(MongoTemplate)进行数据更新操作,包括修改字段值、增删字段、修改数组内容等,并展示了如何利用算数和条件操作实现更复杂的更新逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址:Spring Data MongoDB--MongoTemplate修改数据--方法/实例_IT利刃出鞘的博客-CSDN博客

简介

        本文用示例介绍Spring Data MongoDB(MongoTemplate)更新数据的方法。

修改数据

修改字段值

@Test
public void testUpdateField() {
    Query query = new Query(Criteria.where("_id").is("614303980f84fe24d7618f28"));

    Update update = new Update();
    update.set("name", "高等数学");

    UpdateResult result = mongoTemplate.updateFirst(query, update, "book");
    assert result.wasAcknowledged();
}

加减数字

支持加减乘除。

@Test
public void testUpdateNumber() {
    Query query = new Query(Criteria.where("_id").is("614303980f84fe24d7618f28"));

    Update update = new Update();
    // inc 方法指定数字增加多少
    update.inc("price",30.04);

    UpdateResult result = mongoTemplate.updateFirst(query, update, "book");
    assert result.wasAcknowledged();
}

修改字段

重命名字段

@Test
public void testRenameFiled() {
    Query query = new Query();
    Update update = new Update().rename("price", "PRICE");

    UpdateResult result = mongoTemplate.updateMulti(query, update, BOOK_COLLECTION);
    assert result.wasAcknowledged();
}

增加字段

set 方法在没有字段时,会自动增加字段

@Test
public void testAddField() {
    Query query = new Query();
    Update update = new Update().set("workspaceId", "default");

    UpdateResult result = mongoTemplate.updateMulti(query, update, BOOK_COLLECTION);
    assert result.wasAcknowledged();
}

删除字段

@Test
public void testRemoveField() {
    Query query = new Query();
    Update update = new Update().unset("_class");

    UpdateResult result = mongoTemplate.updateMulti(query, update, BOOK_COLLECTION);
    assert result.wasAcknowledged();
}

修改数组

插入数组内容

@Test
public void testAddToArray() {
    Query query = new Query(Criteria.where("_id").is("614303980f84fe24d7618f28"));

    Update update = new Update();
    // 添加一个,数组中存在元素在忽略添加
    //update.addToSet("tags").value("a");
    // 添加多个,数组中存在元素则忽略添加
    //update.addToSet("tags").each("a", "b", "c", "c");

    // 无论是否存在,都添加到数组, 可以通过 atPosition 指定存放位置
    update.push("tags").atPosition(1).value("101");

    UpdateResult ret = mongoTemplate.updateFirst(query, update, "book");
    assert ret.wasAcknowledged();
}

移除数组内容

@Test
public void testRemoveArray() {
    Query query = new Query(Criteria.where("_id").is("614303980f84fe24d7618f28"));

    Update update = new Update();
    // 移除单个数据
    //update.pull("tags","a");
    // 移除多个数据
    update.pullAll("tags", new Object[]{"a", "b", "101"});

    UpdateResult ret = mongoTemplate.updateFirst(query, update, "book");
    assert ret.wasAcknowledged();
}

替换数组内容

// 数组内字符串更新
@Test
public void testUpdateArray1() {
    Query query = new Query();
    
    // 将标签数组中,所有 "编程" 替换为 "程序设计"
    Update update = new Update();
    update.set("tags.$[element]", "程序设计");
    update.filterArray(Criteria.where("element").is("编程"));

    UpdateResult ret = mongoTemplate.updateMulti(query, update, "book");
    assert ret.wasAcknowledged();
}
// 数组内子文档更新
@Test
public void testUpdateArray2() {
    Query query = new Query();
    Update update = new Update();
    // 将作者姓名为 "王爽" 替换为 "王爽爽"
    update.set("authors.$[element].name", "王爽爽");
    update.filterArray(Criteria.where("element.name").is("王爽"));

    UpdateResult ret = mongoTemplate.updateMulti(query, update, "book");
    assert ret.wasAcknowledged();
}

复杂修改

使用算数操作和条件操作,根据文档实际数据选择更新内容

AggregationUpdate update = Aggregation.newUpdate()
    .set("average").toValue(ArithmeticOperators.valueOf("tests").avg())     
    .set("grade").toValue(ConditionalOperators.switchCases(                 
    when(valueOf("average").greaterThanEqualToValue(90)).then("A"),
    when(valueOf("average").greaterThanEqualToValue(80)).then("B"),
    when(valueOf("average").greaterThanEqualToValue(70)).then("C"),
    when(valueOf("average").greaterThanEqualToValue(60)).then("D"))
                          .defaultTo("F")
                         );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值