jr.*_*jr. 8 spring-data spring-data-mongodb
我有一个像这样的MongoDB结构:
record = { 'field': 'value',
'field2': 'value2',
'events' : [ { 'event1': 1 }, { 'event2' : 2 }]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Spring Data MongoDB包来访问这些数据.主要是对数据进行写入,所以我想使用原生的"$ push"功能将"事件"添加到"记录"中,但我似乎无法弄清楚如何在没有获取的情况下使用MongoRepository.整个记录,然后推送并保存回来?
在使用MongoRepository时,您从未真正拥有具体的实现.Spring根据注释或方法本身的名称处理所有内容
UPDATE
是否正确的方法是在存储库上实现自定义方法然后使用MongoTemplate手动执行?
例:
FooRepository.java
public interface FooRepository extends
CrudRepository<Foo, ObjectId>,
AppointmentWarehouseRepositoryCustom {
}
Run Code Online (Sandbox Code Playgroud)
FooRepositoryCustom.java
public interface AppointmentWarehouseRepositoryCustom {
public void pushMethod();
}
Run Code Online (Sandbox Code Playgroud)
FooRepositoryImpl.java
public class FooRepositoryImpl implements
AppointmentWarehouseRepositoryCustom {
@Autowired
protected MongoTemplate mongoTemplate;
public void pushMethod() {
// Push methods here.
}
}
Run Code Online (Sandbox Code Playgroud)
Jea*_*ond 16
是的,您必须在存储库上实现自定义方法,您的push方法将是这样的:
public class FooRepositoryImpl implements
AppointmentWarehouseRepositoryCustom {
@Autowired
protected MongoTemplate mongoTemplate;
public void pushMethod(String objectId, Object... events) {
mongoTemplate.updateFirst(
Query.query(Criteria.where("id").is(objectId)),
new Update().pushAll("events", events), Foo.class);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样做,但我遇到了一个问题,即没有保留"_class"字段.推送的对象本身是通过配置的转换器运行的,但由于某种原因,未写入该推送对象的"_class"字段.但是,如果我自己注入转换器并将对象写入DBObject,则会保留并写入"_class"字段.因此变成:
public class FooRepositoryImpl implements
AppointmentWarehouseRepositoryCustom {
@Autowired
protected MongoTemplate mongoTemplate;
public void pushMethod(String objectId, Object event) {
DBObject eventObj = new BasicDBObject();
converter.write(event, eventObj);
mongoTemplate.updateFirst(
Query.query(Criteria.where("id").is(objectId)),
new Update().push("events", eventObj), Foo.class);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7456 次 |
| 最近记录: |