【问题标题】:How to use spring-data mongodb without objectId to upsert?如何使用没有objectId的spring-data mongodb进行更新?
【发布时间】:2019-01-16 10:24:40
【问题描述】:

我正在尝试使用 spring-data 将我们当前对 POJO 的使用替换为 mongodb 到 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 是帮助理解问题的简化版本,并不是我使用的最终版本。

【问题讨论】:

    标签: java spring mongodb spring-data-mongodb


    【解决方案1】:

    the official docs 中有一个关于“更新插入”的部分。看来您必须在 MongoTemplate 上使用 upsert()findAndModify()

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

    【讨论】:

    • 是的,但是在这种情况下,我需要手动创建Update 对象,因此自动 POJO 映射丢失了,我回到了我想避免的问题。
    • 在这种情况下,我认为find() 后跟save() 是您唯一可用的方法。
    • 不是我想要的答案,但我相信现在是我拥有的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多