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 に答える