Azure Cosmos DB Spring Boot 如何用Criteria查询嵌套子文档字段
嵌套数组内字段的查询实现
Spring Data Azure Cosmos DB 的 CosmosTemplate + Criteria 组合支持两种方案实现对trip数组内trip_id字段的条件查询,可根据实际需求选择:
方案1:嵌套路径直接构造等值条件
直接通过点号拼接的字段路径定位到数组元素内的字段,适配Cosmos DB对数组字段的自动解析逻辑:
// 通过"trip.trip_id"路径直接关联数组元素内的trip_id字段 Criteria criteria = Criteria.getInstance( CriteriaType.IS_EQUAL, "trip.trip_id", Collections.singletonList("RTD8997283"), Part.IgnoreCaseType.ALWAYS ); CosmosQuery cosmosQuery = new CosmosQuery(criteria).with(Sort.unsorted()); Iterable<StopInfo> items = cosmosTemplate.find(cosmosQuery, StopInfo.class, "myContainer");
该写法会被自动解析为Cosmos DB原生数组匹配逻辑:只要文档中
trip数组内存在任意一个元素的trip_id值等于目标值,就会返回该完整文档。
方案2:通过数组专属查询类型精准定义匹配规则
如果需要避免路径解析的歧义,可以直接调用Cosmos DB内置的数组包含查询能力,明确指定数组的匹配条件:
Criteria criteria = Criteria.getInstance( CriteriaType.ARRAY_CONTAINS, "trip", Collections.singletonList( // 定义数组元素需要满足的内部条件 Criteria.getInstance(CriteriaType.IS_EQUAL, "trip_id", Collections.singletonList("RTD8997283")) ) );
注意事项
- 若需求是过滤数组内不匹配的元素、仅返回符合条件的数组片段,仅靠默认的
Criteria查询无法实现,需要自定义原生Cosmos SQL语句,通过CosmosQuery的自定义SQL注入能力完成查询,在SQL中通过ARRAY(SELECT ... FROM t IN c.trip WHERE 条件)语法实现数组内部的投影过滤。 - 路径写法的兼容性:Spring Data Azure Cosmos DB 3.x以上版本完整支持点号嵌套路径对数组内字段的匹配,旧版本如果出现路径不识别的问题,可直接替换为
ARRAY_CONTAINS的写法。
内容的提问来源于stack exchange,提问作者Sibi Sundarrajan
相关产品推荐
相关产品推荐

