我正在尝试使用 spring-data 来用 mongodb 替换我们当前使用的 POJO to Document,在这种特殊情况下,我不使用字段作为实体的 Id,而是使用一些字段。
例如,如果我有这个 pojo:
class Thing {
public String firstName;
public String lastName;
public Int age;
}
现在要将其保存到 mongodb,我首先将其转换为文档:
Document doc = new Document();
doc.append("firstName", thing.firstName);
doc.append("lastName", thing.lastName);
doc.append("age", thing.age);
然后我创建一个查询:
BasicDBObject query = new BasicDBObject(
and(
new BasicDBObject("firstName", thing.firstName),
new BasicDBObject("lastName", thing.lastName))
然后我使用 mongodb 驱动程序更新插入文档。
collection.updateOne(query, document, UpdateOptions().upsert(true))
这样我就可以只更新age
,而无需担心对我来说没有意义的ObjectId。
现在我想将其更改为 spring-data-mongodb,以便在编写文档转换部分时不易出错并提高工作效率。但我找不到如何用 spring-data-mongodb 做类似的事情,MongoRepository api 中的保存是基于 ObjectId 的,我找不到任何注释或 bean 来覆盖/创建让我做这样的事情。
在完美的世界中,我会拥有类似于 spring-data-mongodb 的复合键之类的东西。例如,我必须这样编写 POJO:
class Thing {
@Id public String firstName;
@Id public String lastName;
public Int age;
}
或者(不是更好的情况,但也许可以接受)
class ThingKey {
public String firstName;
public String lastName;
}
class Thing {
@Id public ThingKey thingKey;
public Int age;
}
保存将能够确定这是对现有实体的更新插入,并据此采取行动。
PS:这里的 POJO 是帮助理解问题的简化版本,并不是我使用的最终版本。
最佳答案
the official docs中有一个关于“更新插入”的部分。看来您必须在 MongoTemplate
上使用 upsert()
或 findAndModify()
。
或者,您可以只执行 find()
,对返回的对象执行更改,然后执行 save()
。
关于java - 如何在没有objectId的情况下使用spring-data mongodb进行更新插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54214977/