如何在Cosmos DB中结合ARRAY_CONTAINS与IS_DEFINED查询数组项
Cosmos DB 查询数组项满足特定条件的正确写法
需要从Cosmos DB集合中筛选出符合以下要求的文档:
- 数组
items中存在某个项,其value等于指定的searchValue - 该数组项不存在
deletedAt属性
数据示例
{ "id": "someId", "items": [ { "value": "val1", "createdAt": "2023-02-20T12:53:19.148Z", "deletedAt": "2023-02-25T15:27:44.408Z" }, { "value": "val2", "createdAt": "2023-02-25T15:27:44.413Z" } ] }
预期结果
- 查询
searchValue为val1时:返回空集合(对应项存在deletedAt) - 查询
searchValue为val2时:返回包含上述文档的集合(对应项无deletedAt)
错误写法及问题
之前尝试的写法不符合语法要求,执行时报错:
SELECT * FROM c WHERE ARRAY_CONTAINS(c.items, {"value": 'val1', IS_DEFINED("deletedAt"): false }, true)
报错信息:
Failed to query item for container myContainer: One of the input values is invalid.
问题出在ARRAY_CONTAINS的第二个参数里直接嵌入了IS_DEFINED函数——这个参数如果是用于部分匹配的对象,只能是静态键值对,不能包含函数表达式。
正确查询写法
可以用以下两种方式实现需求:
方式1:使用EXISTS子查询
SELECT * FROM c WHERE EXISTS( SELECT VALUE item FROM item IN c.items WHERE item.value = 'val2' AND NOT IS_DEFINED(item.deletedAt) )
方式2:使用ANY关键字
SELECT * FROM c WHERE ANY(item IN c.items WHERE item.value = 'val2' AND NOT IS_DEFINED(item.deletedAt))
这两种写法都会遍历items数组中的每个元素,同时校验value匹配和deletedAt不存在两个条件,只要数组中有一个元素满足,就会返回对应的文档。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

