检查行是否包含 DynamoDB 中的嵌套项?

Check if row contains a nested item in DynamoDB?

我正在尝试将 PartiQL 与 DynamoDB 结合使用来执行 SQL 查询以检查设备是否处于非活动状态并包含错误。这是我正在使用的查询:

SELECT * 
FROM "table" 
WHERE "device"."active" = 0 AND "device"."error" IS NOT NULL

但是我注意到,即使设备没有错误项,查询仍然 returns 一行。如何查询只包含错误项的设备?

有错误项

{
    "id": "value",
    "name": "value,
    "device": {
        "active": 0,
        "error": {
            "reason": "value"
        }
    }
}

没有错误项

{
    "id": "value",
    "name": "value,
    "device": {
        "active": 0
    }
}

您正在寻找 IS NOT MISSING :) 那是过滤表达式运算符函数 attribute_exists.

的 partiql 版本

给定 table 主键 PK、排序键 SK 和以下数据:

PK SK myMap
foo 1 {}
foo 2 {"test": {}}
-- Returns both foo 1 and foo 2
SELECT * 
FROM "my-table"
WHERE "PK" = 'foo' AND "myMap"."test" IS NOT NULL
-- Returns just foo 2
SELECT * 
FROM "my-table"
WHERE "PK" = 'foo' AND "myMap"."test" IS NOT MISSING

还要确保我的示例在 WHERE 子句中指定了 PK - 否则,您的查询将是一个完整的扫描。不过,也许这就是你想要的。只是需要注意的事情。