You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:07:16