![](/img/trans.png)
[英]MongoDb aggregation for filtering list based on ids present in object of array from all document of same collection
[英]Filter the document if any value of the provided list is present in the document's array
文檔
{
"status": {
"active": [
"A",
"B"
],
"inactive": [
"C",
"D"
]
}
}
代碼
Criteria statusFilterCriteria = Criteria.getInstance(
CriteriaType.ARRAY_CONTAINS,
"status.active",
Collections.singletonList("A"),
Part.IgnoreCaseType.NEVER);
CosmosQuery cosmosQuery = new CosmosQuery(statusFilterCriteria);
過濾標准是,如果列表的任何值存在於活動數組中,則應返回 Document。 由於A存在於活動數組中,因此我得到 A 作為響應。 但是當我在列表中同時傳遞A和B時,我的回復中沒有得到文檔。
您只能傳遞單個值,因為 Cosmos DB 后端中的 ARRAY_CONTAINS 函數本身僅支持在 json 數組中搜索單個值(請參閱此處的文檔)。 我意識到這在 Spring 和 Criteria.getInstance() 的上下文中具有誤導性,因為這是期望List<Object>
值,所以你做出的自然假設是它將搜索列表中的所有值......但是你只能傳遞一個值。
為此,您需要每次對列表中的每個值運行查詢。 類似於下面的代碼片段,假設您的容器中有多個這種形狀的文檔,並將所有符合過濾條件的文檔收集到一個 HashMap 中。
Iterable<User> results = null;
String[] lettersArray = { "A", "B" };
HashMap<String, User> docMap = new HashMap<String, User>();
List<String> letters = Arrays.asList(lettersArray);
for (String object : letters) {
Criteria statusFilterCriteria = Criteria.getInstance(
CriteriaType.ARRAY_CONTAINS, "status.active", Collections.singletonList(object),
Part.IgnoreCaseType.NEVER);
CosmosQuery cosmosQuery = new CosmosQuery(statusFilterCriteria);
results = cosmosTemplate.find(cosmosQuery, User.class, "myContainer5");
for (User user : results)
docMap.put(user.getId(), user);
}
List<String> docIds = new ArrayList<String>();
for (String id : docMap.keySet())
docIds.add(id);
System.out.println("ids of docs that contain any of the letters: " + String.join(", ", docIds));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.