2017-11-30 1 views
0

mongodb AとBに2つの文書があります。文書Aのcodeフィールドには、値= (文書Bから)+ id(文書Aから)が含まれています。何らかの形でnameが更新されている場合は、更新フィールドcodeをドキュメントAから自動的に取得します。私はmongodbでスプリングブートを使用しています。どのように私はこれを達成できるかを親切にお勧めしますか?mongodbのイベントトラッキング

@Document 
public class A{ 
private String id; 
private String code; 
.... 
} 

@Document 
public class B { 
private String id; 
private String name; 
.. 
} 

答えて

0

アプリケーション・ロジックにサービスコールを使用し、codeフィールドを使用してABとの間の関係を表現する必要がある場合。

Anameの部分で検索するクエリ方法を作成し、codeにします。

@Repository 
public interface DocARepo extends MongoRepository<A, String> { 
    List<A> findByCodeStartsWith(String code); 
} 

新しいname一部でcodeを更新Aためのサービスメソッドを作成します。 nameを「車」から「車」に変更することを避けるためにはDELIMITERが必要ですが、Bnameの「カート」もあります。

@Service 
public class DocAService { 
    public final String DELIMITER = "::"; 

    @Autowired 
    private DocARepo aRepo; 

    public void updateNames(String prevName, String name) { 
    List<A> aList = docARepo.findByCodeStartsWith(prevName + DELIMITER); 
    for (A a : aList) { 
     String code = a.setCode(name + DELIMITER + a.getId()); 
    } 
    aRepo.save(aList); 
    } 
} 

Mongo Lifecycle eventsを活用するBeforeSaveEventにリスナーを作成します。

@Component 
public class DocBBeforeSave extends AbstractMongoEventListener<B> { 
    @Autowired 
    private DocBRepo bRepo; 
    @Autowired 
    private DocAService aService; 

    @Override 
    public void onBeforeSave(BeforeSaveEvent<Person> event) { 
    B b = event.getSource(); 
    if (b.getId() == null) return; // new doc 

    B old = bRepo.findOne(b.getId()); 

    if (!Objects.equals(old.getName(), b.getName())) 
     aService.updateNames(old.getName(), b.getName()); 
    } 
} 

また、あなたはABとの間の関係を作成するために@DBRefを使用することができます。

@Document 
public class A { 
    private String id; 
    @DBRef 
    @NotNull 
    private B b; 

    ... 

    @Transient 
    public String getCode() { 
    return b.getName() + id; 
    } 
} 

次に、データベースがAが検索されたときに熱心Bフェッチ、ABへの参照を格納し、codeBからnameの一過性となります。

+0

私は値を追跡するために(私はJaversを使っています)、一時的なコードを作ることはできません。また、 'code'値の更新が必要なのでサービスができません。 '文書' b'が変化しています。 –

+0

サービスコールは 'B'の' name'を更新し、前の 'name'を使って' A'をすべて探し出し、 'code'を更新します。それは要求されているものとどのように違うのですか? –

+0

'B'のイベントがトリガされ、nameの値が変更された場合、データベースは自動的に' A'を更新しなければならないように自動的に 'A'の更新を行います。 –

関連する問題