如何在没有 objectId 的情况下使用 spring-data mongodb 进行更新?

How to use spring-data mongodb without objectId to upsert?

我正在尝试使用 spring-data 将我们当前对 POJO 的使用替换为 mongodb,在这种特殊情况下,我没有使用字段作为实体的 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 override/create 让我做这样的事情。

在一个完美的世界中,我会为 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 中有一个关于 "upserting" 的部分。看来您必须在 MongoTemplate 上使用 upsert()findAndModify()

或者,您可以只执行 find(),对返回的对象执行更改,然后执行 save()