Bạn có thể cập nhật phương pháp bên dưới. Bạn đang cố gắng cung cấp nhiều $and mỗi toán tử có một tiêu chí.
Btw, bạn không cần and rõ ràng ing như mongodb cung cấp and ngầm định ing khi các tiêu chí được phân tách bằng dấu phẩy.
public void getFile(Map<String, Object> metaData) throws Exception {
Criteria criteria = new Criteria();
metaData.forEach((k, v) -> criteria.and("metadata." + k).is(v));
GridFSDBFile gridFSDBFile = gridFsOperations.findOne(new Query(criteria));
if (gridFSDBFile == null) {
throw new HttpConflictException();
}
Trong những trường hợp bạn cần and rõ ràng ing, bạn có thể sử dụng mã dưới đây
public void getFile(Map<String, Object> metaData) throws Exception {
Criteria criteria = new Criteria();
Criteria[] andExpressions = metaData.entrySet().stream().
map(kv -> Criteria.where("data." + kv.getKey()).is(kv.getValue()))
.toArray(Criteria[]::new);
Query andQuery = new Query();
Criteria andCriteria = new Criteria();
andQuery.addCriteria(andCriteria.andOperator(andExpressions));
GridFSDBFile gridFSDBFile = gridFsOperations.findOne(andQuery);
if (gridFSDBFile == null) {
throw new HttpConflictException();
}