在这种特殊情况下,我尝试使用spring-data替换mongodb对POJO到Document的当前用法,而不是使用字段作为我使用某些字段的实体的ID。
例如,如果我有这个pojo:
class Thing {
public String firstName;
public String lastName;
public Int age;
}
现在将其保存到mongodb中,我首先要转换为Document:
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是简化版本,可以帮助您理解问题,而不是我使用的最终版本。
答案 0 :(得分:2)
在the official docs中有一个关于“ upserting”的部分。看来您必须在upsert()
上使用findAndModify()
或MongoTemplate
。
或者,您可以只执行find()
,对返回的对象进行更改,然后执行save()
。