简介

        本文用示例介绍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")
);