/ / Kvôli obmedzeniam kom.mongodb.BasicDBObject výnimka pri pridávaní viacerých kritérií GridFSDBFile dotaz - jar, mongodb, spring-mvc, spring-boot, spring-data-mongodb

Kvôli obmedzeniam výkladu com.mongodb.BasicDBObject pri pridaní viacerých kritérií GridFSDBFile dotaz - jar, mongodb, spring-mvc, spring-boot, spring-data-mongodb

Chcem pridať viacero kritérií v GridFSDBFile, opakoval som mapu a vytvoril objekt kritérií, ale dostávam nasledujúcu výnimku

Kvôli obmedzeniam com.mongodb.BasicDBObject nemôžete pridať a zadal sa druhý výraz "$ a".

Môj útržok kódu je

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

odpovede:

1 pre odpoveď č. 1

Metódu môžete aktualizovať nižšie. Snažíte sa zaistiť viac dolárov a operátorovi z ktorých každá má kritériá.

Btw Nebudete potrebovať explicitné a "ing ako mongodb poskytuje implicitné a keď kritériá sú oddelené čiarkou.

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

V prípadoch, keď potrebujete explicitné a "ing", môžete použiť nižšie uvedený kód

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