2013-01-09 43 views
7

Tôi có một cấu trúc MongoDB như thế này:

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

Tôi đang sử dụng Spring dữ liệu MongoDB gói để truy cập dữ liệu này. Sẽ có chủ yếu ghi vào dữ liệu, vì vậy tôi muốn sử dụng chức năng "$ push" bản địa để thêm "sự kiện" vào "bản ghi", nhưng tôi không thể tìm ra cách làm điều đó với MongoRepository mà không tìm nạp toàn bộ hồ sơ và sau đó đẩy nó và lưu nó trở lại?

Khi sử dụng MongoRepository, bạn chưa bao giờ thực sự thực hiện cụ thể. Xuân xử lý tất cả mọi thứ dựa trên chú thích hoặc tên của các phương pháp tự

CẬP NHẬT

Sẽ cách chính xác để có để thực hiện một phương pháp tùy chỉnh trên kho lưu trữ và sau đó sử dụng MongoTemplate để làm điều đó bằng tay?

Ví dụ:

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. 
    } 
} 

Trả lời

13

Có, bạn phải thực hiện một phương pháp tùy chỉnh trên kho lưu trữ và phương pháp push của bạn sẽ là một cái gì đó như thế này:

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); 
    } 
} 
+0

Và chúng tôi có thể đẩy đối tượng vào danh sách được đánh dấu là @DBRef không? – javadev

+0

Điều đó có xảy ra với bạn bằng bất kỳ cơ hội nào để đẩy vào bộ sưu tập @DBRef không? – javadev

5

Bạn có thể làm điều này nhưng tôi chạy vào một vấn đề mà các "_class" lĩnh vực wasn không được bảo tồn. Bản thân đối tượng được đẩy đã được chạy thông qua trình chuyển đổi đã được định cấu hình nhưng vì một lý do nào đó, trường "_class" của đối tượng được đẩy đó không được viết. Tuy nhiên, nếu tôi tiêm bộ chuyển đổi và đã viết đối tượng đó vào bản thân DBObject, thì trường "_class" được giữ lại và ghi. Do đó sẽ trở thành:

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); 
    } 
} 
Các vấn đề liên quan