我在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;
..
}
答案 0 :(得分:0)
如果您必须通过使用A
字段来表示B
和code
之间的关系,请在应用程序逻辑中使用服务调用。
创建一个查询方法,以A
的{{1}}部分检索name
。
code
为使用新@Repository
public interface DocARepo extends MongoRepository<A, String> {
List<A> findByCodeStartsWith(String code);
}
部分更新A
的{{1}}创建服务方法。此处需要code
,以避免您想要将name
从“汽车”更改为“汽车”但您还有一些DELIMITER
与name
'购物车”。
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
时急切地获取A
,B
成为瞬态属性来自A
的{{1}}。