[英]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.