8

我有一个这样的MongoDB结构:

record = { 'field': 'value', 
           'field2': 'value2',
           'events' : [ { 'event1': 1 }, { 'event2' : 2 }]
         }

我正在使用 Spring Data MongoDB 包来访问这些数据。将主要写入数据,所以我想使用本机“$push”功能将“事件”添加到“记录”,但我似乎无法弄清楚如何在不获取的情况下使用 MongoRepository整个记录,然后将其推送并保存回来?

在使用 MongoRepository 时,您永远不会真正拥有具体的实现。Spring 根据注解或方法本身的名称处理所有事情

更新

正确的方法是在存储库上实现自定义方法,然后使用 MongoTemplate 手动完成吗?

例子:

FooRepository.java

public interface FooRepository extends
    CrudRepository<Foo, ObjectId>,
        AppointmentWarehouseRepositoryCustom {
}

FooRepositoryCustom.java

public interface AppointmentWarehouseRepositoryCustom {
    public void pushMethod();
}

FooRepositoryImpl.java

public class FooRepositoryImpl implements
    AppointmentWarehouseRepositoryCustom {

    @Autowired
    protected MongoTemplate mongoTemplate;

    public void pushMethod() {
        // Push methods here. 
    }
}
4

2 回答 2

18

是的,您必须在存储库上实现自定义方法,您的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);
    }
}
于 2013-01-10T17:07:47.457 回答
5

你可以这样做,但我遇到了一个问题,“_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);
  }
}
于 2013-08-30T16:38:34.530 回答