【问题标题】:Filter the document if any value of the provided list is present in the document's array如果文档的数组中存在所提供列表的任何值,则过滤文档
【发布时间】:2022-07-14 01:55:22
【问题描述】:

文档

    {
    "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);

过滤标准是,如果 list 的任何值存在于 active 数组中,则应返回 Document。 由于 A 存在于活动数组中,因此我得到 A 作为响应。 但是,当我在列表中同时传递 AB 时,我的回复中没有收到文档。

【问题讨论】:

    标签: java azure azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    您只能传递单个值,因为 Cosmos DB 后端中的 ARRAY_CONTAINS 函数本身仅支持在 json 数组中搜索单个值(请参阅文档 here)。我意识到这在 Spring 和 Criteria.getInstance() 的上下文中具有误导性,因为这是预期的 List<Object> 值,所以你做出的自然假设是它将搜索列表中的所有值......但你可以只传递一个值。

    为此,您需要每次对列表中的每个值运行查询。类似于下面的 sn-p,它假设您的容器中有多个这种形状的文档,并将所有满足过滤条件的文档收集到一个 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));
    

    【讨论】:

      猜你喜欢
      • 2019-04-16
      • 1970-01-01
      • 2018-01-26
      • 2020-05-14
      • 2019-10-20
      • 2019-01-12
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多