/ / Ze względu na ograniczenia wyjątku com.mongodb.BasicDBObject przy dodawaniu wielu kryteriów Zapytanie GridFSDBFile - spring, mongodb, spring-mvc, spring-boot, spring-data-mongodb

Ze względu na ograniczenia wyjątku com.mongodb.BasicDBObject przy dodawaniu wielu kryteriów Kwerenda GridFSDBFile - wiosna, mongodb, spring-mvc, spring-boot, wiosna-data-mongodb

Chcę dodać wiele kryteriów w GridFSDBFile, Mam iterowane mapę i utworzone obiektu kryteriów, ale otrzymuję następujące wyjątku

Z powodu ograniczeń com.mongodb.BasicDBObject, nie można dodać podano drugie wyrażenie "$ i".

Mój fragment kodu jest

public void getFile(Map<String, Object> metaData) throws Exception {
Criteria criteria = new Criteria();
metaData.forEach((k, v) -> criteria.andOperator(Criteria.where("metadata." + k).is(v)));
GridFSDBFile gridFSDBFile = gridFsOperations.findOne(new Query(criteria));
if (gridFSDBFile == null) {
throw new HttpConflictException();
}

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz zaktualizować metodę do poniżej. Próbujesz podać wiele $ i operatora, z których każdy ma określone kryteria.

Btw Nie potrzebujesz wyraźnego słowa i "ing as mongodb" zapewnia niejawne poszukiwanie, gdy kryteria są oddzielone przecinkiem.

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

W przypadkach, w których potrzebujesz wyraźnego i "ing", możesz użyć poniższego kodu

public void getFile(Map<String, Object> metaData) throws Exception {
Criteria criteria = new Criteria();
List<Criteria> andExpressions = metaData.entrySet().stream().
map(kv -> Criteria.where("data." + kv.getKey()).is(kv.getValue())).
collect(toList());
Query andQuery = new Query();
Criteria andCriteria = new Criteria();
andQuery.addCriteria(andCriteria.andOperator(andExpressions.toArray(new Criteria[andExpressions.size()])));
GridFSDBFile gridFSDBFile = gridFsOperations.findOne(andQuery);
if (gridFSDBFile == null) {
throw new HttpConflictException();
}