mongodb中的事件跟踪

时间:2017-11-30 17:53:41

标签: java mongodb spring-boot

我在mongodb A和B中有两个文档。来自文档A的字段code包含value = 名称(来自文档B)+ id(来自文档A)。如果某种方式name正在更新,我想自动从文档A更新字段code。我正在使用mongodb的春季靴子。请建议我如何实现这个目标?

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

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

1 个答案:

答案 0 :(得分:0)

如果您必须通过使用A字段来表示Bcode之间的关系,请在应用程序逻辑中使用服务调用。

创建一个查询方法,以A的{​​{1}}部分检索name

code

为使用新@Repository public interface DocARepo extends MongoRepository<A, String> { List<A> findByCodeStartsWith(String code); } 部分更新A的{​​{1}}创建服务方法。此处需要code,以避免您想要将name从“汽车”更改为“汽车”但您还有一些DELIMITERname'购物车”。

B

name上创建一个监听器,以点按Mongo Lifecycle events

@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);
  }
}

或者,您可以使用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()); } } @DBRef之间建立关系。

A

现在,数据库将在B中存储对@Document public class A { private String id; @DBRef @NotNull private B b; ... @Transient public String getCode() { return b.getName() + id; } } 的引用,在检索到B时急切地获取AB成为瞬态属性来自A的{​​{1}}。