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

如何仅在DynamoDB嵌套数组新增对象时触发AWS Lambda函数

问题

我正在为DynamoDB事件触发的AWS Lambda函数创建过滤规则,只希望当对象中databases数组新增元素时触发函数。

DynamoDB中存储的对象简化结构如下:

{
 "databases": [
  {
   "file_name": "db.ods",
   "upload_date": "2023-05-30T12:39:22.000Z",
   "url": "https://an-s3-path/db.ods"
  }
 ],
 "updated_at": "2023-05-30T12:38:54.000Z",
 "created_at": "2023-05-30T12:38:54.000Z"
}

目前已配置两个过滤规则:

  • 仅在记录创建或更新时触发(删除时不触发):
    {
      "eventName": [
        "INSERT",
        "MODIFY"
      ]
    }
    
  • 检查databases下的url字段存在:
    {
      "dynamodb": {
        "databases": {
          "url": [{"exists": true}]
        }
      }
    }
    

但现在需要精准检测是否向databases数组添加了新对象,推测需要对比新旧值,但不清楚如何实现。查阅AWS官方文档后,仅找到eq、contains、exists等数值对比运算符,没有找到嵌套对象/数组变化检测的相关内容。

解决方案

要精准检测databases数组是否新增元素,需借助DynamoDB Streams事件的新旧数据镜像(OldImage、NewImage),结合过滤规则的逻辑运算符实现:

核心逻辑

  • INSERT事件:新记录的databases数组非空且包含有效URL,即视为新增数据库(因为是首次创建的记录)
  • MODIFY事件:对比新旧镜像中databases数组的长度,新数组长度大于旧数组长度时,判定为新增了元素

完整过滤规则

将以下规则组合使用(过滤规则默认是逻辑AND关系,嵌套的or/and用于实现分支判断):

{
  "eventName": ["INSERT", "MODIFY"],
  "or": [
    {
      "and": [
        {"eventName": ["INSERT"]},
        {"dynamodb": {"NewImage": {"databases": {"L": [{"url": [{"exists": true}]}]}}}}
      ]
    },
    {
      "and": [
        {"eventName": ["MODIFY"]},
        {"dynamodb": {"OldImage": {"databases": {"L": [{"exists": true}]}}}},
        {"dynamodb": {"NewImage": {"databases": {"L": [{"url": [{"exists": true}]}]}}}},
        {"dynamodb": {"NewImage": {"databases": {"L": {"size": [">", {"dynamodb": {"OldImage": {"databases": {"L": {"size": true}}}}}]}}}}}
      ]
    }
  ]
}

规则细节解释

  • L是DynamoDB对数组类型(List)的标识,用于指定数组字段的类型
  • size运算符用于获取数组的长度,通过对比新旧镜像的数组长度,判断是否有元素新增
  • 对于MODIFY事件,先确保新旧镜像中都存在databases数组,避免因数组从无到有或被删除导致的判断错误
  • 规则中整合了url存在检查,确保新增的数组元素包含有效URL,匹配你之前的需求

内容的提问来源于stack exchange,提问作者Joel García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:32:14