如何在没有 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()
。
我正在尝试使用 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()
。