簡體   English   中英

如果文檔的數組中存在所提供列表的任何值,則過濾文檔

[英]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 作為響應。 但是當我在列表中同時傳遞AB時,我的回復中沒有得到文檔。

您只能傳遞單個值,因為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM