2017-08-16 58 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