【问题标题】:How to make an upsert in an array of objects with Spring Boot MongoTemplate?如何使用 Spring Boot MongoTemplate 在对象数组中进行更新插入?
【发布时间】:2023-01-06 23:58:14
【问题描述】:
我在我的 Spring Boot 应用程序中工作,它是一个带有 MongoDB 数据库的 REST 服务。
想象一下这份文件:
_id: ObjectId('628b4d3ff5b1c1736c0b654c')
name: "MyComputer"
OS: "windows"
config: [
{
configId: ObjectId('628b4d3ff5b1c1736c0b654a'),
type: "Type A"
}
]
我想检查配置中是否有任何类型的对象“A型”.如果有,我想更新配置ID让我们说ObjectId('628b4d3ff5b1c1736c0b654d'),如果没有,我想创建一个类型为的新对象:“A型”和configId: ObjectId('628b4d3ff5b1c1736c0b654d').
我如何在 MongoTemplate 中执行此操作?我试过这样的:
ObjectId ConfigId = new ObjectId("628b4d3ff5b1c1736c0b654a");
Query query = Query.query(Criteria.where("_id").is(new ObjectId('628b4d3ff5b1c1736c0b654c')));
Update update = new Update().filterArray(Criteria.where("config.id").is(ConfigId))
.set("config", new Config(ConfigId, "Type A"));
mongoTemplate.upsert(query, update, Computer.class);
好像不行...
【问题讨论】:
标签:
java
mongodb
spring-boot
upsert
mongotemplate
【解决方案1】:
看起来您正在尝试更新配置数组中对象的 configId 字段,该对象的 configId 字段的值为 ObjectId('628b4d3ff5b1c1736c0b654a'),或者如果这样的对象不存在,则在具有指定configId 和类型的配置数组。
要使用 MongoTemplate 实现此目的,您可以使用位置运算符来标识要更新的配置数组中的特定元素。位置运算符是出现在更新表达式中的$符号,用于标识应应用更新的数组元素。
下面是一个示例,说明如何使用位置运算符更新配置数组中具有 configId 字段且值为 ObjectId('628b4d3ff5b1c1736c0b654a') 的对象的 configId 字段,或者如果这样的对象不存在则插入新对象:
ObjectId configId = new ObjectId("628b4d3ff5b1c1736c0b654a");
ObjectId newConfigId = new ObjectId("628b4d3ff5b1c1736c0b654d");
Query query = Query.query(Criteria.where("_id").is(new ObjectId("628b4d3ff5b1c1736c0b654c"))
.and("config.configId").is(configId));
Update update = new Update().set("config.$.configId", newConfigId);
mongoTemplate.upsert(query, update, Computer.class);
此代码创建一个查询,将文档与指定的 _id 和配置数组中的对象与指定的 configId 相匹配。此更新将匹配数组元素的 configId 字段设置为 newConfigId 的值。
如果配置数组中没有匹配的对象,更新将插入一个具有指定configId 和类型字段的新对象。