2017-08-16 86 views
0

我遍历键/值对列表并对每个键/值执行查找。我可以创建一个单一的查询文档在sql中是一种联合,所以只会有一个数据库调用。在spring mongo db查询中指定多个条件

List<User> userList = new ArrayList<User>(); 
    for (Map accounts:attributes) { 
     Query query = new Query(); 
     List<Criteria> andCriteriaList = new ArrayList<Criteria>(); 
     accounts.forEach((key, value) -> { 
      Criteria criteria = Criteria.where((String) key).is(value); 
      andCriteriaList.add(criteria); 
     }); 
     query.addCriteria(new Criteria().andOperator(andCriteriaList.toArray(new Criteria[andCriteriaList.size()]))); 
     if (mongoTemplate.exists(query, User.class)) { 
      userList.add((User)mongoTemplate.find(query, User.class)); 
      //System.out.println(mongoTemplate.find(query, User.class)); 
     } 

感谢,

+0

这应该输出的查询可以使用'$ in'运营商。类似于Query query = new Query(); (userList.stream().map(User :: getId).collect(Collectors.toList()))); 列表 users = mongoTemplate.find(query,User.class);' – Veeram

+0

@Veeram,对不起,我忘记提及查询文档本质上是动态的,条件可能不同。我提供了一个更合适的例子 – maverick

+0

Np。您也可以随时从传入属性中动态地准备“Query”对象。我看到了最新的更新。在进行转换时遇到什么问题? – Veeram

回答

1

可以重构代码来创建$or表达式。没有明确的$and运营商需要。

喜欢的东西

Query orQuery = new Query(); 
Criteria orCriteria = new Criteria(); 
List<Criteria> orExpression = new ArrayList<>(); 
for (Map<String, Object> accounts : attributes) { 
    Criteria expression = new Criteria(); 
    accounts.forEach((key, value) -> expression.and(key).is(value)); 
    orExpression.add(expression); 
} 
orQuery.addCriteria(orCriteria.orOperator(orExpression.toArray(new Criteria[orExpression.size()]))); 
List<User> userList = mongoOperations.find(orQuery, User.class); 

{ "$or" : [{ "key1" : "value1", "key2" : "value2" }, { "key3" : "value3", "key4" : "value4" }] } 
+0

这工作完美 – maverick