原文网址: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")
                         );

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐