如何使用不带objectId的spring-data mongodb进行向上插入?

时间:2019-01-16 10:24:41

标签: java spring mongodb spring-data-mongodb

在这种特殊情况下,我尝试使用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是简化版本,可以帮助您理解问题,而不是我使用的最终版本。

1 个答案:

答案 0 :(得分:2)

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

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