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

标签 java spring mongodb spring-data-mongodb

我正在尝试使用 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/

相关文章:

java - 尽管使用 c3p0 仍出现 `Could not open connection` 问题

java - 如何分析 PermGen 的内容?

java - 如何将现有的 SOAP 请求消息导入 SoapUI?

java - 在 Android 中使用日出/日落 REST API。如何正确传递获取到的位置坐标的URL?

mongodb - Mongo $subtract date 在聚合 $match block 中不起作用

node.js - 这是结合 MongoDB 和 Redis 的好方案吗?

javascript - 根据某些条件,使用 mongodb 聚合从数组中获取对象以及同一级别的其他字段

java - 数组列表排序

每个月的第一个星期一的 Spring @scheduled cron 表达式

java - setDefaultHostnameVerifier 中 verify 方法的用途